Per verificare la presenza di numeri pari e dispari, il controllo del bit più basso è più efficiente rispetto all'utilizzo del modulo?
>>> def isodd(num):
return num & 1 and True or False
>>> isodd(10)
False
>>> isodd(9)
True
- riza
Sì. Il modulo timeit
nella libreria standard è il modo in cui controlli queste cose. Es.:
$ python -m timeit -s 'def isodd(x): x & 1' 'isodd(9)'
1000000 loops, best of 3: 0.446 usec per loop
$ python -m timeit -s 'def isodd(x): x & 1' 'isodd(10)'
1000000 loops, best of 3: 0.443 usec per loop
$ python -m timeit -s 'def isodd(x): x % 2' 'isodd(9)'
1000000 loops, best of 3: 0.461 usec per loop
$ python -m timeit -s 'def isodd(x): x % 2' 'isodd(10)'
1000000 loops, best of 3: 0.453 usec per loop
Come vedi, sul mio (first-day==old==slow;-) Macbook Air, la soluzione &
è ripetibilmente tra 7 e 18 nanosecondi più veloce della
%
non solo ti dice cosa è più veloce, ma di quanto (esegui i test un paio di volte), il che di solito mostra quanto sia estremamente irrilevante (davvero< /em> importa circa 10 nanosecondi di differenza, quando l'overhead di chiamare la funzione è di circa 400?!-)...
Convincere i programmatori che le micro-ottimizzazioni sono essenzialmente irrilevanti si è rivelato un compito impossibile, anche se sono passati 35 anni (durante i quali i computer hanno ottenuto ordini di grandezza più velocemente!) da quando Knuth ha scritto
Dobbiamo dimenticare il piccolo efficienze, diciamo circa il 97% del tempo: l'ottimizzazione prematura è il radice di ogni male.
che, come ha spiegato, è una citazione da una dichiarazione ancora più antica di Hoare. Immagino che tutti siano totalmente convinti che il LORO caso rientri nel restante 3%!
Quindi, invece di ripetere all'infinito "non importa", noi (Tim Peters in particolare merita gli onori lì) abbiamo inserito il modulo della libreria Python standard timeit
, che lo rende banalmente facile per misurare tali micro-benchmark e quindi consentire almeno a alcuni programmatori di convincersi che, hmmm, questo caso rientra nel gruppo del 97%!-)