barplot - ¿Por qué no usar siempre psyco para el código Python?
pandas plot (8)
Psyco actualmente usa mucha memoria. Solo se ejecuta en procesadores compatibles con Intel 386 (bajo cualquier sistema operativo) en este momento. Hay algunas diferencias semánticas sutiles (es decir, errores) con la forma en que funciona Python; no deberían ser aparentes en la mayoría de los programas.
Ver también la sección de advertencias . Para un ejemplo difícil, noté que mi aplicación web con plantillas generadas por Cheetah y DB I / O no ganaba velocidad apreciable.
psyco parece ser bastante útil para optimizar el código de Python, y lo hace de una manera no intrusiva.
Por lo tanto, uno tiene que preguntarse. Asumiendo que siempre estás en una arquitectura x86 (que es donde se ejecutan la mayoría de las aplicaciones en estos días), ¿por qué no siempre usas psyco
para todos los códigos Python? ¿Comete errores a veces y arruina la corrección del programa? ¿Aumenta el tiempo de ejecución para algunos casos extraños?
¿Has tenido alguna experiencia negativa con eso? Mi experiencia más negativa fue que hizo que mi código fuera más rápido en solo un 15%. Usualmente es mejor
Naturalmente, usar psyco no es un reemplazo de algoritmos y codificación eficientes. Pero si puede mejorar el rendimiento de su código por el costo de dos líneas (importar y llamar a psyco), no veo una buena razón para no hacerlo.
1) La sobrecarga de memoria es la principal, como se describe en otras respuestas. También paga el costo de compilación, que puede ser prohibitivo si no es selectivo. De la referencia del usuario :
Compilar todo es a menudo exagerado para aplicaciones de tamaño mediano o grande. Los inconvenientes de compilar demasiado son el tiempo dedicado a la compilación, más la cantidad de memoria que consume este proceso. Es un equilibrio sutil para mantener.
2) El rendimiento realmente puede verse perjudicado por la compilación de Psyco. De nuevo desde la guía del usuario (sección de "errores conocidos" ):
También hay errores de rendimiento: situaciones en las que Psyco ralentiza el código en lugar de acelerarlo. Es difícil hacer una lista completa de las posibles razones, pero aquí hay algunas más comunes:
- El
map
incorporado yfilter
funciones defilter
deben evitarse y reemplazarse por la comprensión de la lista. Por ejemplo,map(lambda x: x*x, lst)
debería reemplazarse por la sintaxis más legible pero más reciente[x*x for x in lst]
.- La compilación de expresiones regulares no parece beneficiarse de Psyco. (La ejecución de expresiones regulares no se ve afectada, ya que es código C.) No habilite Psyco en este módulo; si es necesario, deshabilítelo explícitamente, por ejemplo, llamando a
psyco.cannotcompile(re.compile)
.
3) Finalmente, hay algunas situaciones relativamente oscuras donde el uso de Psyco en realidad introducirá errores. Algunos de ellos se enumeran aquí .
Cuando uso Pyglet descubrí que no podía usar psyco en toda la aplicación sin hacer que mi aplicación no funcionara. Podría usarlo en pequeñas secciones del código de matemáticas pesadas, por supuesto, pero no era necesario, así que no me molesté.
Además, psyco ha hecho cosas extrañas con mis resultados de creación de perfiles (como, bueno, no modificarlos en absoluto desde la versión no psyco). Sospecho que no funciona bien con el código de perfil.
Simplemente no lo uso a menos que realmente quiera la velocidad, que no es tan frecuente. Mi prioridad es la optimización de algoritmos, que generalmente resulta en aceleraciones más agradables.
Simplemente: "Porque el código ya funciona lo suficientemente rápido".
También depende de dónde esté tu cuello de botella. Principalmente estoy haciendo aplicaciones web y allí los cuellos de botella son probablemente más IO y base de datos. Entonces debes saber dónde optimizar.
También ten en cuenta que tal vez primero deberías pensar en tu código en lugar de arrojarlo directamente sobre él. Así que estoy de acuerdo con Devin, que las optimizaciones del algoritmo deberían ser lo primero y que podrían tener una menor posibilidad de efectos secundarios no deseados.
Un par de otras cosas:
- No parece mantenerse activamente.
- Puede ser un cerdo de la memoria.
Uno nunca debe confiar en alguna solución mágica para solucionar sus problemas. El uso de psyco para acelerar un programa lento generalmente no es necesario. Los algoritmos incorrectos se pueden reescribir y las partes que requieren velocidad se pueden escribir en otro idioma. Por supuesto, su pregunta pregunta por qué no la usamos para el impulso de velocidad de todos modos, y hay un poco de sobrecarga cuando usa psyco. Psyco usa memoria, y esas dos líneas simplemente se sienten como sobrecarga cuando las miras. En cuanto a mi razón personal sobre por qué no uso psyco, es porque no es compatible con x86_64, que veo como la nueva arquitectura en crecimiento (especialmente con 2038 acercándose tarde o temprano). Mi alternativa es pipy, pero tampoco soy muy aficionado a eso.
psyco está muerto y ya no se mantiene. Es hora de encontrar otro