2009-07-07 2 views
5

Я играл с pyglet. Это очень здорово. Тем не менее, если я запускаю мой код, который находится в исполняемом файле (назовем его game.py) с префиксом обычнымПрограммный контроль оптимизации python?

#!/usr/bin/env python 

делая

./game.py 

, то это немного неуклюжим. Но если я запускаю его с

python -O ./game.py 

или

PYTHONOPTIMIZE=1 ./game.py 

затем его супер-гладкой.

Мне все равно, почему он работает медленно без оптимизации; В документации pyglet упоминается, что оптимизация отключает множество утверждений, а также проверку ошибок OpenGL, и я рад оставить ее на этом.

Мой вопрос: как люди распространяют код Python, убедитесь, что конечные пользователи (с нулевым интересом к отладке или изменению кода) запускают оптимизированную версию кода. Конечно, есть лучший способ, чем просто сообщить людям, что они используют оптимизацию в примечаниях к выпуску (которые, вероятно, они не будут читать в любом случае)?

В Linux я могу легко обеспечить ./game скрипт для запуска файла для конечных пользователей:

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

, но это не очень кросс-платформенным.

У меня есть идея, я должен быть в состоянии изменить #! строку

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

или

#!/usr/bin/env python -O 

, но те, похоже, не работает, как ожидалось, и я не что они будут делать в Windows.

Есть ли способ контролировать оптимизацию из кода, о котором я не знаю? Что-то вроде:

import runtime 
    runtime.optimize(True) 

Что считается лучшей практики в этой области людьми судоходных мультиплатформенный код питона?

+2

Это не ответ, так как ответ С.Лоттса был абсолютно правильным и исчерпывающим. Идите с game.sh и game.bat, он работает. Но просто комментарий: #! строка ничего не делает в Windows, она полностью игнорируется. –

ответ

14

"В Linux я могу легко обеспечить ./game скрипт для запуска файла для конечных пользователей:"

Correct.

«но это не очень кросс-платформенный».

Half-correct. Есть ровно два языка оболочки, которые имеют значение. Стандартный Linux «sh» и нестандартная Windows «bat» (a/k/a cmd.exe), и это все, что есть в настоящее время. [Когда я был ребенком, были Open VMS DCL и странный язык командной оболочки Data General и RSX-11 и всевозможные отличные вещи. Слава богу за стандарт Posix.]

игра.ш

python -O game.py 

game.bat

python -O game.py 

Интересно, что файлы одинаковы, только расширение (и формат файла) должен быть изменен, чтобы сделать различные ОС, счастливы.

Если вы хотите true односторонняя кросс-платформа, вы должны помнить, что Python является языком оболочки. Это тоже работает.

game-startup.py

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

Спасибо! Мне нравится, когда проблема имеет приятное простое решение. – timday

2

Отвечая на Ваш вопрос (как противостоящие исправить ошибку, которую С. Лотт сделал совершенно), я думаю, много времени люди, которые распространяют код Python не беспокоиться об этом, потому что для флага оптимизации очень редко. Я считаю, что Pyglet - единственное исключение, о котором я слышал в годы использования Python. Цитирование из Python docs, «Оптимизатор в настоящее время не очень помогает, он только удаляет утверждения assert».

+0

Аналогично: это первый раз, когда флаг оптимизации делает заметную разницу вообще для любого кода на питоне. Код, который заставлял меня поднять вопрос, использует большое количество вызовов «немедленного режима» GL; Я подозреваю (не проверял) пиглет делает различные утверждения (возможно, включая glGetError) для каждого из них, и все это складывается. – timday

+3

Но -OO удаляет все docstrings, что может привести к неожиданностям. Matplotlib использует программно построенные docstrings, например. % s выполняется в docstring, которые заменены на f .__ doc__ = f .__ doc__% kwdict, что вызывает ошибку при работе с -OO. –