È & più veloce di % quando si controllano i numeri dispari?

2022-07-29 13:00:06

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

Source
Risposta


32
  • 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 }^{ soluzione.

    % 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%!-)