Как ускорить выполнение Python? - PullRequest
1 голос
/ 10 ноября 2011

У меня есть проект, написанный на Python, который работает с большим объемом данных.Я хотел бы ускорить время выполнения.

Проще говоря, допустим, у меня есть образец полностью оптимизированного кода:

def foo(x):
   doSomething

main():
   for i in range(1,10000000):
      foo(i)

Есть ли способ ускорить это?Например, используя многопроцессорную обработку или другие вещи?И самое главное, стоит ли?

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

Ответы [ 6 ]

9 голосов
/ 10 ноября 2011

Чтобы ответить на ваш последний вопрос, если у вас проблемы с производительностью, это того стоит. Это единственный критерий.

Что касается того, как:

Если ваш алгоритм медленный, потому что он вычислительно дорог, рассмотрите возможность переписать его как расширение C или использовать Cython , который позволит вам писать быстрые расширения на языке Python-esque , Кроме того, PyPy становится все быстрее и быстрее и может просто запускать ваш код без изменений.

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

Наконец, если это какая-то основная задача разбрызгивания данных, подумайте об использовании быстрого хранилища данных. Все основные реляционные базы данных оптимизированы для Wazoo, и вы можете обнаружить, что ваша задача может быть ускорена, просто получив базу данных, которая сделает это за вас. Возможно, вы даже сможете сформировать его так, чтобы он подходил для хранилища Redis , которое может блестяще агрегировать большие наборы данных.

7 голосов
/ 10 ноября 2011

Единственный реальный способ узнать - это профилировать и измерять.Ваш код может делать что угодно.«doSomething» может быть time.sleep(10), и в этом случае отключение 10000000 процессов приведет к запуску всей программы приблизительно за 10 секунд (игнорируя издержки на разветвление и возникающие в результате замедления).

Используйте http://docs.python.org/library/profile.html и проверьте, где находятся горлышки бутылок, посмотрите, можете ли вы оптимизировать «полностью оптимизированную» программу, используя лучшее кодирование.Если это уже достаточно быстро, остановитесь.

Затем, в зависимости от того, привязан ли он к ЦП или вводу / выводу, и к оборудованию, которое у вас есть, вы можете попробовать многопроцессорность или многопоточность.Вы также можете попробовать распределить по нескольким машинам и сделать что-то вроде карты / сокращения, если ваша проблема может быть решена.

3 голосов
/ 10 ноября 2011

Вы можете использовать интерпретатор PyPy , в который встроен JIT-компилятор, он может фактически улучшить производительность по сравнению с такими циклами.Вот ссылка , которая объясняет некоторые ускорения, которые интерпретатор PyPy предлагает по сравнению с обычным CPython.

Или вы можете написать свой код, используя Cython , который позволяет использовать собственные расширения c внутри python.Огромные куски numpy написаны таким образом, чтобы получить хорошие ускорения.

Или вы можете забыть использовать python и просто написать это в ASM.Конечно, это будет труднее сделать, но когда вы увидите, что ваша программа работает на ~ 1% быстрее, чем все остальные?Вы будете счастливы, что прошли лишнюю милю.

2 голосов
/ 10 ноября 2011

Кроме того, что уже было сказано, вы можете проверить cython .Но профиль, прежде чем вы делаете.Кроме того, pypy может стоить проверить.Не должно быть никакой работы, чтобы заставить это работать.

0 голосов
/ 28 августа 2018

Когда-то был Pypy.Идея хорошая, но она всегда немного запаздывает по сравнению с последней официальной версией Python.

Сегодня я обнаружил Numba.Кажется, он быстрее и более совместим, чем Pypy.

Я предлагаю в качестве введения эту хорошую статью.Он сравнивает многие результаты оптимизации и ускорения:

https://www.ibm.com/developerworks/community/blogs/jfp/entry/Python_Meets_Julia_Micro_Performance?lang=en

0 голосов
/ 10 ноября 2011

Если задачи можно выполнять параллельно, вы можете исследовать использование пула процессов с помощью модуля multiprocessing и распределить задания между подпроцессами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...