Python ускоритель - PullRequest
       5

Python ускоритель

4 голосов
/ 01 сентября 2010

Я планирую использовать Python для разработки веб-приложения. У кого-нибудь есть идеи по поводу любого ускорителя для python? (что-то вроде eAccelerator или apc для php), если нет, есть ли способ кэшировать предварительно скомпилированный байт-код python? Любое представление о сравнении производительности между python и php (при условии, что задержки в db / network одинаковы)

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 01 сентября 2010

В этом есть хитрость.

Это называется mod_wsgi.

Суть работает так:

  1. Для "статического""content (.css, .js, images и т. д.) помещают их в каталог, чтобы они обслуживались Apache, и ваша программа Python не будет знать, что они были отправлены.динамический «контент (сама главная HTML-страница), который вы используете mod_wsgi для форка« внутреннего »процесса, который выполняется вне Apache.

Это быстрее, чем PHP, потому что теперь происходит несколько вещей одновременно.Apache отправил запрос бэкэнд-процессу, а затем перешел к обработке следующего запроса, пока бэкэнд еще не выполнил первый.

Кроме того, когда вы отправляете свою HTML-страницу, последующие запросыобрабатываются Apache без вашей программы Python, не зная и не заботясь о том, что происходит.Это приводит к огромным ускорениям.Ничего общего со скоростью Python.Все, что связано с общей архитектурой.

5 голосов
/ 01 сентября 2010

Пока вы выполняете тривиальные объемы работы в своем "основном скрипте" (тот, который вы напрямую вызываете с помощью python и который получает __name__ из __main__), вам не нужно беспокоиться о "кэшировании предварительноскомпилированный байт-код python ": когда вы import foo, foo.py сохраняются на диск (в том же каталоге), что и foo.pyc, при условии, что этот каталог доступен для записи вами, поэтому и без того дешевая компиляция в байт-код происходит один раз и «навсегда после» Python будет загружать foo.pyc непосредственно в каждом новом процессе, который выполняет import foo - в пределах одного процесса каждый import foo, кроме первого, является просто быстрым поиском в словаре в памяти (sys.module словарь).Основная идея производительности в Python: гарантирует, что каждый бит существенного кода происходит внутри def операторов в модулях - не не имеет ни одного на верхнем уровне модуля, в основном скриптеили особеннов пределах exec и eval операторов / выражений! -).

У меня нет тестов для PHP против Python, но я заметил, что Python продолжает довольно заметно оптимизироваться с каждым новым выпуском, поэтому убедитесь, чтоВы сравниваете недавний выпуск (в идеале 2.7, по крайней мере, 2.6), если вы хотите увидеть «быстрый Python».Если вы пока не нашли его достаточно быстрым, cython (диалект Python, предназначенный для компиляции непосредственно в C, а затем в машинный код с некоторыми ограничениями) сегодня является самым простым способом выборочной оптимизации тех модулей, профилирование которых показывает, что вам нужноэто.

3 голосов
/ 02 сентября 2010

Другие упоминали файлы байт-кода Python, но это в значительной степени не имеет значения.Это связано с тем, что механизмы размещения для Python, за исключением CGI, сохраняют веб-приложение Python в памяти между запросами.Это отличается от PHP, который эффективно отбрасывает приложение между запросами.Таким образом, Python не нуждается в ускорителе, поскольку механизмы работы веб-хостинга Python позволяют избежать проблем, с которыми сталкивается PHP.

2 голосов
/ 01 сентября 2010

Скомпилированный байт-код Python автоматически кэшируется в файлах .pyc в каждой среде, которую я видел.Насколько мне известно, необходимо сделать что-то еще.

Если вы хотите создать эти файлы напрямую, вы можете использовать: http://docs.python.org/library/py_compile.html

...