Antes de introducir optimizaciones de rendimiento a expensas de la legibilidad, busque en módulos como psyco que harán algunas compilaciones JIT-ish de distintas funciones, a menudo con resultados llamativos, sin menoscabo de la legibilidad.
Entonces, si realmente desea iniciarse en la ruta de optimización, primero debe aprender a medir y perfilar. La optimización DEBE SER CUANTITATIVA - no vaya con su instinto. El generador de perfiles de punto de acceso le mostrará las funciones en las que su programa está consumiendo la mayor cantidad de tiempo.
Si la optimización resulta una función como esta está siendo con frecuencia llamados:
def get_order_qty(ordernumber):
# look up order in database and return quantity
Si hay alguna repetición de ordernumbers, entonces memoization sería una buena técnica de optimización de aprender, y es fácilmente empaquetado en una @memoize decorator para que haya poco impacto en la legibilidad del programa. El efecto de la memorización es que los valores devueltos para un conjunto dado de argumentos de entrada se almacenan en caché, de modo que la función costosa puede invocarse solo una vez, con las llamadas subsecuentes resueltas contra la caché.
Por último, considere levantar invariantes fuera de los bucles. Para grandes estructuras multidimensionales, esto puede ahorrar mucho tiempo; de hecho, en este caso, yo diría que esta optimización mejora la legibilidad de, ya que a menudo sirve para aclarar que alguna expresión puede calcularse a un alto nivel. dimensión en la lógica anidada.
(Por cierto, ¿es esto realmente lo que quería decir? • En una sentencia if con una o poner siempre la condición más probable que falle en primer lugar, por lo que el segundo no lo examinará.
que debe pensar que esto podría ser el caso para "y", pero un "o" se cortocircuitará si el primer valor es verdadero, guardando la evaluación del segundo término del condicional. Así que cambiaría esta "regla" de optimización a:
- Si prueba "A y B", ponga A primero si es más probable que evalúe a
F alse.
- Si prueba "A o B", ponga A en primer lugar si es más probable que evalúe a Verdadero.
Pero a menudo, la secuencia de las condiciones es impulsado por los propios pruebas:
if obj is not None and hasattr(obj,"name") and obj.name.startswith("X"):
No se puede reordenar estos para la optimización - que tienen ser en este orden (o simplemente dejar que el excepciones volar y atrapar más adelante:
if obj.name.startswith("X"):
No sé acerca de Python, pero estas micro "optimizaciones" son una mala práctica al escribir el código C++. –