Ускорение Питона - PullRequest
       69

Ускорение Питона

42 голосов
/ 06 октября 2008

Это на самом деле два вопроса, но они очень похожи, и для простоты я решил, что я просто свожу их вместе:

  • Во-первых : Принимая во внимание устоявшийся проект на Python, какие есть приличные способы ускорить его помимо простой оптимизации в коде?

  • Во-вторых : Каковы хорошие способы значительно повысить производительность при написании программы на python?

Что касается первого вопроса, представьте, что вы получили достойно написанный проект, и вам нужно улучшить производительность, но вы не можете получить большую выгоду за счет рефакторинга / оптимизации. Что бы вы сделали, чтобы ускорить его в этом случае, за исключением переписывания чего-то вроде C?

Ответы [ 18 ]

3 голосов
/ 06 октября 2008

Просто замечание по использованию psyco: в некоторых случаях это может привести к более медленной работе. Особенно, когда я пытаюсь использовать psyco с кодом, написанным на C. Я не могу вспомнить статью, в которой я это читал, но функции map() и reduce() были упомянуты специально. К счастью, вы можете сказать psyco не обрабатывать указанные функции и / или модули.

3 голосов
/ 29 октября 2008

Часто можно достичь скоростей, близких к C (достаточно близко для любого проекта, использующего Python, в первую очередь!), Заменив явные алгоритмы, написанные от руки в Python, неявным алгоритмом, использующим встроенный вызов Python. Это работает, потому что большинство встроенных Python написаны на C в любом случае. Ну, конечно, в CPython ;-) https://www.python.org/doc/essays/list2str/

3 голосов
/ 06 октября 2008

Я пытаюсь следовать этой процедуре:

  • импорт психо; psyco.full ()
  • Если это не достаточно быстро, запустите код через профилировщик, посмотрите, где узкие места. (ОТКЛЮЧИТЕ психо для этого шага!)
  • Старайтесь делать вещи, о которых упоминали другие, чтобы получить код в этих узких местах как можно быстрее.
    • Такие вещи, как [str (x) для x в l] или [x.strip () для x в l], намного, намного медленнее, чем map (str, x) или map (str.strip, x ).
  • После этого, если мне все еще нужно больше скорости, на самом деле действительно легко запустить PyRex. Сначала я скопирую часть кода Python, поместил его прямо в код Pyrex и посмотрю, что произойдет. Тогда я вертлюсь с этим, пока это не становится все быстрее и быстрее.
2 голосов
/ 29 октября 2008

Каноническая ссылка на то, как улучшить код Python, находится здесь: PerformanceTips . Я бы рекомендовал не оптимизировать в C, если вам действительно не нужно. Для большинства приложений вы можете получить необходимую производительность, следуя правилам, указанным в этой ссылке.

1 голос
/ 14 мая 2009

Кроме (великолепно) psyco и (приятно) шедскин , я бы рекомендовал попробовать cython отличную вилку pyrex .

Или, если вы не спешите, я рекомендую просто подождать. Новые виртуальные машины Python выходят, и unladen-swallow найдет свой путь в мейнстрим.

1 голос
/ 06 октября 2008

Если вы используете psyco, я бы порекомендовал psyco.profile() вместо psyco.full(). Для более крупного проекта будет разумнее использовать функции, которые были оптимизированы, и использовать меньше памяти.

Я бы также рекомендовал взглянуть на итераторы и генераторы. Если ваше приложение использует большие наборы данных, это сэкономит вам много копий контейнеров.

0 голосов
/ 16 января 2017

Я считаю, что для установленного проекта основной выигрыш в производительности будет заключаться в максимально возможном использовании внутренней библиотеки Python.

Некоторые советы здесь: http://blog.hackerearth.com/faster-python-code

0 голосов
/ 17 сентября 2013

После того, как этот вопрос был задан, было предложено несколько способов ускорить код Python:

  • Pypy имеет JIT-компилятор, что делает его намного быстрее для кода, связанного с процессором.
  • Pypy записан в Rpython , подмножестве Python, которое компилируется в собственный код, используя цепочку инструментов LLVM.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...