2009-07-07 10 views
5

Ho giocato con pyglet. È molto carino. Tuttavia, se corro il mio codice, che si trova in un file eseguibile (lo chiamano game.py) preceduto con la solitaControllo programmatico dell'ottimizzazione python?

#!/usr/bin/env python 

facendo

./game.py 

quindi è un po 'goffo. Ma se l'eseguo con

python -O ./game.py 

o

PYTHONOPTIMIZE=1 ./game.py 

allora la sua super-liscio.

Non mi interessa molto perché funziona lento senza ottimizzazione; la documentazione di pyglet menziona che l'ottimizzazione disabilita i numerosi asser e anche il controllo degli errori di OpenGL, e sono felice di lasciarlo.

La mia domanda è: in che modo le persone che distribuiscono il codice Python si assicurano che gli utenti finali (con zero interesse nel debug o nella modifica del codice) eseguano la versione ottimizzata del codice. Sicuramente c'è un modo migliore di dire semplicemente alle persone di assicurarsi che usino l'ottimizzazione nelle note di rilascio (che probabilmente non leggeranno comunque)?

Su Linux posso facilmente fornire uno script ./game per eseguire il file per gli utenti finali:

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

ma che non è molto cross-platform.

Ho un'idea dovrei essere in grado di cambiare la linea #! a

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

o

#!/usr/bin/env python -O 

ma quelli non sembrano funzionare come previsto, e io non sono certo cosa farebbero su Windows.

C'è un modo per controllare l'ottimizzazione all'interno del codice di cui non sono a conoscenza? Qualcosa di simile:

import runtime 
    runtime.optimize(True) 

quello che è considerato migliori pratiche in questo settore da parte di persone di spedizione multi-piattaforma codice Python?

+2

Questa non è una risposta, poiché la risposta di S.Lotts era completamente corretta ed esauriente. Vai con game.sh e game.bat, funziona. Ma solo un commento: Il #! line non fa assolutamente nulla su Windows, è completamente ignorato. –

risposta

14

"Su Linux Posso facilmente fornire uno script ./game per eseguire il file per gli utenti finali:"

corretta.

"ma non è molto multipiattaforma".

Mezzo corretto. Ci sono esattamente due linguaggi di shell che contano. Standard Linux "sh" e Windows "Bat" non standard (a/k/a cmd.exe) e questo è tutto ciò che esiste al giorno d'oggi. [Quando ero un ragazzino, c'erano Open VMS DCL e il linguaggio a shell strano di Data General e RSX-11 e tutti i tipi di grandi cose. Grazie a Dio per lo standard Posix.]

gioco.sh

python -O game.py 

game.bat

python -O game.py 

È interessante notare che i file sono gli stessi, solo l'estensione (e il formato di file) hanno dovuto essere modificato per rendere le varie del sistema operativo felice.

Se si desidera true crossover di tutte le dimensioni, è necessario ricordare che Python è un linguaggio shell. Questo genere di cose funziona, anche.

game-startup.py

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

Grazie! Mi piace quando un problema ha una bella soluzione semplice. – timday

2

rispondere alla tua domanda (come opporsi a fissare il vostro problema, che S. Lott ha fatto perfettamente), credo che un sacco di tempo le persone che distribuiscono codice Python non lo fanno preoccuparsi di questo, perché è raro che il flag di ottimizzazione abbia alcun effetto. Credo che Pyglet sia l'unica eccezione di cui ho sentito parlare in anni di utilizzo di Python. Citando da Python docs, "L'ottimizzatore attualmente non aiuta molto, rimuove solo le affermazioni di asserzione".

+0

Allo stesso modo: questa è la prima volta che vedo il flag di ottimizzazione che fa una differenza evidente con qualsiasi codice Python. Il codice che mi ha fatto sollevare la domanda utilizza un gran numero di chiamate GL "modalità immediata"; Sospetto (non ho controllato) pyglet fa vari assert (probabilmente incluso un glGetError) per ogni singolo e tutto sommato. – timday

+3

Ma -OO rimuove tutte le docstring, che possono portare a sorprese. Matplotlib utilizza docstrings progettate a livello di codice, ad es. % s escape nella docstring che sono sostituiti con f .__ doc__ = f .__ doc__% kwdict, che causa un errore durante l'esecuzione con -OO. –