Yep. El módulo timeit
en la biblioteca estándar es cómo verificar esas cosas. Por ejemplo:
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(9)'
1000000 loops, best of 3: 0.446 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(10)'
1000000 loops, best of 3: 0.443 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(10)'
1000000 loops, best of 3: 0.453 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(9)'
1000000 loops, best of 3: 0.461 usec per loop
Como se ve, en mi (primer día de edad == == lento ;-) Macbook Air, la solución &
es repetible entre 7 y 18 nanosegundos más rápido que la solución %
.
timeit
no sólo te dice lo que es más rápido, pero por la cantidad de (basta con ejecutar las pruebas de unas pocas veces), que por lo general muestra cómo sumamente poco importante que es (¿verdad realmente cuidado diferencia de unos 10 nanosegundos, cuando la sobrecarga de llamar a la función es alrededor de 400?! -) ...
Convencer a los programadores de que las micro-optimizaciones son esencialmente irrelevantes ha demostrado ser una tarea imposible -a pesar de que han pasado 35 años (sobre qué computadoras han recibido órdenes de magnitud más rápido!) desde Knuth wrote
Debemos olvidarnos de las pequeñas eficiencias , digamos aproximadamente el 97% del tiempo : la optimización prematura es la raíz de todos los males.
que como explicó es una cita de una declaración aún más antigua de Hoare. ¡Creo que todos están totalmente convencidos de que SU CASO cae en el 3% restante!
Así que en lugar de repetir repetidas veces "no importa", nosotros (Tim Peters, en particular, merece los honores) poner en el módulo de biblioteca de Python estándar timeit
, que hace que sea trivialmente fácil medir tales micro-referencias y por lo tanto ser titular al menos algunos programadores convencerse de que, hmmm, este caso se cae en el grupo de 97% -!)
¿Qué es "y verdadero o falso"? – FogleBird
Si está tratando de obtener un resultado booleano, simplemente haga bool (num & 1) – FogleBird
Estoy usando Python 3.1 – riza