2009-07-07 14 views
5

Gram z pyglet. To bardzo miłe. Jednakże, jeśli uruchomię mój kod, który jest w pliku wykonywalnego (nazywają to game.py) prefiksem zwykłejProgramowa kontrola optymalizacji Pythona?

#!/usr/bin/env python 

wykonując

./game.py 

potem to trochę niezgrabne. Ale jeśli uruchomię go z

python -O ./game.py 

lub

PYTHONOPTIMIZE=1 ./game.py 

następnie jego super-gładką.

Nie obchodzi mnie, dlaczego działa bez optymalizacji; Dokumentacja pyglet wspomina, że ​​optymalizacja wyłącza liczne potwierdzenia, a także sprawdza błędy OpenGL i cieszę się, że to zostawię.

Moje pytanie brzmi: w jaki sposób ludzie rozpowszechniający kod Pythona upewniają się, że użytkownicy końcowi (bez zainteresowania debugowaniem lub modyfikacją kodu) uruchamiają zoptymalizowaną wersję kodu. Na pewno jest lepszy sposób niż tylko mówienie ludziom, aby upewnili się, że używają optymalizacji w notatkach do wydania (których i tak pewnie nie przeczytają)?

W systemie Linux można łatwo zapewnić ./game skrypt do uruchomienia pliku dla użytkowników końcowych:

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

ale to nie jest bardzo cross-platform.

Mam pomysł, że powinienem być w stanie zmienić linię #! do

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

lub

#!/usr/bin/env python -O 

ale te nie wydają się działać zgodnie z oczekiwaniami, a ja nie jestem jasne, co zrobią w systemie Windows.

Czy istnieje jakiś sposób sterowania optymalizacją z poziomu kodu, którego nie jestem świadomy? Coś jak:

import runtime 
    runtime.optimize(True) 

Co jest uważane za najlepsze praktyki w tej dziedzinie przez ludzi żeglugi wieloplatformowy kodu Pythona?

+2

To nie jest odpowiedź, ponieważ odpowiedź S.Lotts była całkowicie poprawna i wyczerpująca. Idź z game.sh i game.bat, to działa. Ale tylko komentarz: #! linia nie robi absolutnie nic w systemie Windows, jest całkowicie ignorowana. –

Odpowiedz

14

„W systemie Linux można łatwo zapewnić skrypt ./game aby uruchomić plik dla użytkowników końcowych:”

Prawidłowe.

"ale to nie jest zbyt wieloplatformowe".

Połowa poprawna. Istnieją dokładnie dwa języki powłoki, które mają znaczenie. Standardowy system Linux "sh" i niestandardowy "bat" systemu Windows (a/k/a cmd.exe) i to wszystko, co jest obecnie. [Kiedy byłem dzieckiem, istniała dziwaczna wersja języka powłoki Open VMS i Data General, RSX-11 i wiele innych świetnych rzeczy. Dzięki Bogu za standard Posix.]

gry.sh

python -O game.py 

game.bat

python -O game.py 

ciekawe pliki są takie same, tylko rozszerzenie (a format pliku) musiał zostać zmieniony, aby różne OS jest szczęśliwy.

Jeśli chcesz true uniwersalną platformę dla wszystkich rozmiarów, musisz pamiętać, że Python jest językiem powłoki. Tego rodzaju rzeczy również działają.

game-startup.py

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

Dzięki! Podoba mi się, gdy problem ma proste proste rozwiązanie. – timday

2

Odpowiadając na pytanie (jako przeciwstawnych do mocowania problemu, który uczynił doskonale S. Lott), myślę, że dużo czasu ludzie, którzy dystrybuują kodu Pythona nie martw się tym, ponieważ flaga optymalizacji nie ma żadnego efektu. Uważam, że Pyglet jest jedynym wyjątkiem, o którym słyszałem od lat używania Pythona. Cytowanie z Python docs, "Optymalizator obecnie niewiele pomaga, usuwa tylko instrukcje assert".

+0

Podobnie: po raz pierwszy zauważyłem, że flaga optymalizacji ma jakąkolwiek zauważalną różnicę dla każdego kodu Pythona. Kod, który spowodował, że podniosłem pytanie, używa dużej liczby wywołań GL w trybie natychmiastowym; Podejrzewam, że (nie sprawdziłem) pyglet wykonuje różne assert (prawdopodobnie włączając w to glGetError) dla każdego z nich i to wszystko się sumuje. – timday

+3

Ale -OO usuwa wszystkie argumenty, co może prowadzić do niespodzianek. Matplotlib używa konstrukturycznie skonstruowanych poleceń, np. % s ucieka w docstringu, które są zastąpione przez f .__ doc__ = f .__ doc__% kwdict, co powoduje błąd podczas działania z -OO. –