2009-07-07 30 views
5

He estado jugando con pyglet. Es muy bonito. Sin embargo, si se me acaba mi código, que está en un archivo ejecutable (lo llaman game.py) como prefijo el habitualControl programático de la optimización de Python?

#!/usr/bin/env python 

haciendo

./game.py 

entonces es un poco torpe. Pero si me quedo con

python -O ./game.py 

o

PYTHONOPTIMIZE=1 ./game.py 

entonces su muy suave.

No me importa mucho por qué se ejecuta lento sin optimización; La documentación de pyglet menciona que la optimización deshabilita numerosas afirmaciones y también la comprobación de errores de OpenGL, y estoy feliz de dejarlo así.

Mi pregunta es: ¿cómo las personas que distribuyen el código Python se aseguran de que los usuarios finales (sin interés en depurar o modificar el código) ejecuten la versión optimizada del código? Seguramente hay una manera mejor que solo decirle a la gente que se asegure de que usan la optimización en las notas de la versión (que probablemente no leerán de todos modos).

En Linux que puede proporcionar fácilmente un script ./game para ejecutar el archivo para los usuarios finales:

#!/bin/sh 
PYTHONOPTIMIZE=1 ./game.py $* 

pero eso no es muy multiplataforma.

Tengo una idea que debería ser capaz de cambiar la línea #! a

#!/usr/bin/env PYTHONOPTIMIZE=1 python 

o

#!/usr/bin/env python -O 

pero los que no parecen funcionar como se esperaba, y no estoy seguro de lo que harían en Windows.

¿Hay alguna forma de controlar la optimización desde el código que desconozco? Algo así como:

import runtime 
    runtime.optimize(True) 

lo que se considera la mejor práctica en este ámbito por las personas que envían el código Python multiplataforma?

+2

Esto no es una respuesta, ya que la respuesta de S.Lotts fue completamente correcta y exhaustiva. Ve con game.sh y game.bat, funciona. Pero solo un comentario: ¡El #! línea no hace absolutamente nada en Windows, se ignora por completo. –

Respuesta

14

"En Linux que puede proporcionar fácilmente un script ./game para ejecutar el archivo para los usuarios finales:"

correcta.

"pero eso no es muy multiplataforma".

Medio correcto. Hay exactamente dos lenguajes de shell que importan. Linux estándar "sh" y Windows no estándar "bat" (a/k/a cmd.exe) y eso es todo lo que hay hoy en día. [Cuando era un niño, estaba Open VMS DCL y el lenguaje de shell extraño de Data General y RSX-11 y todo tipo de cosas geniales. Gracias a Dios por el estándar Posix.]

juego.sh

python -O game.py 

game.bat

python -O game.py 

Curiosamente los archivos son los mismos, sólo la extensión (y el formato de archivo) tuvo que ser cambiado para hacer feliz del varios Sistemas Operativos.

Si quiere true plataforma multipropósito de un solo tamaño, debe recordar que Python es un lenguaje de shell. Este tipo de cosas funciona, también.

game-startup.py

import subprocess 
subprocess.Popen("python -O game.py") 
+0

Gracias! Me gusta cuando un problema tiene una buena solución simple. – timday

2

Respondiendo a su pregunta (que se opone a la fijación de su problema, que S. Lott hizo a la perfección), creo que una gran parte del tiempo la gente que distribuye el código Python no lo hacen preocúpese por esto, porque es raro que la bandera de optimización tenga algún efecto. Creo que Pyglet es la única excepción de la que he oído hablar en años de uso de Python. Citando del Python docs, "El optimizador actualmente no ayuda mucho, solo elimina declaraciones de afirmación".

+0

Del mismo modo: esta es la primera vez que veo que la marca de optimización marca una diferencia notable en cualquier código de Python. El código que me hizo plantear la pregunta usa una gran cantidad de llamadas GL de "modo inmediato"; Sospecho (no lo he comprobado) que pyglet hace varias aseveraciones (probablemente incluyendo un glGetError) para cada una y todo se suma. – timday

+3

Pero -OO elimina todas las cadenas de documentos, lo que puede generar sorpresas. Matplotlib utiliza cadenas de documentos creadas mediante programación, p. % s escapes en la cadena de documentos que se sustituyen por f .__ doc__ = f .__ doc__% kwdict, lo que provoca un error al ejecutar con -OO. –

Cuestiones relacionadas