Які інструменти чи підходи доступні для прискорення коду, написаного на Python?


29

Передумови: Я думаю, що я, можливо, захочу перенести якийсь код, який обчислює матричні експоненціально-векторні продукти, використовуючи метод підпростору Крилова від MATLAB до Python. (Зокрема, функція expmvp Jitse Niesen , яка використовує алгоритм, описаний у цьому документі .) Однак я знаю, що якщо я не використовую важко використовувати функції з модулів, отриманих із складених бібліотек (тобто я використовую лише сирий Python, а не багато вбудованих- у функціях), то це може бути досить повільним.

Питання: Які інструменти чи підходи доступні, щоб допомогти мені пришвидшити код, який я записую в Python для продуктивності? Зокрема, мене цікавлять інструменти, які максимально автоматизують процес, хоча загальні підходи також вітаються.

Примітка. У мене є старіша версія алгоритму Jitse, і я не використовував його деякий час. Зробити цей код можна дуже просто, але я відчув, що він стане хорошим конкретним прикладом, і це пов'язано з моїм власним дослідженням. Обговорення мого підходу до реалізації цього конкретного алгоритму в Python - це цілком інше питання.


Я дав відповідь на це питання Python : scicomp.stackexchange.com/questions/2429/… Я думаю, що підказки та посилання там будуть вам корисні.
AlexE

(h / t до @AlexE для того, щоб дати мені знати про це) Існує певне перекриття серед цього питання (як) писати симуляції, які працюють швидше? , і які є хороші стратегії для покращення серійної продуктивності мого коду? . Якесь злиття могло бути в порядку. Я розмістив про це на Meta.
Джефф Оксберрі

1
Окрім хороших відповідей тут, подивіться за цим посиланням .
Майк Данлаве

Відповіді:


40

Я буду розбивати свою відповідь на три частини. Профілювання, прискорення коду python через c та прискорення python через python. На мою думку, Python має одні з найкращих інструментів для того, щоб дізнатись про ефективність вашого коду, а потім просвердлити до реальних шийок пляшки. Прискорення коду без профілювання - це як спроба вбити оленя узі.

Якщо ви справді цікавитесь лише продуктами mat-vec, я рекомендую scipy.sparse .

Інструменти Python для профілювання

профіль та модулі cProfile : ці модулі дадуть вам стандартний аналіз часу виконання та функціональний стек викликів. Дуже приємно зберігати їх статистику, використовуючи модуль pstats, ви можете переглянути дані різними способами.

kernprof : цей інструмент поєднує безліч процедур для виконання таких завдань, як строка за строковим кодом

memory_profiler : цей інструмент виробляє друкований друк вашого коду по черзі.

Таймери IPython : Цяtimeitфункція дуже приємна для швидкого інтерактивного бачення відмінностей у функціях.

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

Cython : cython - найшвидший спосіб взяти кілька функцій у python та отримати швидший код. Ви можете прикрасити функцію за допомогою cython-варіанту python, і він генерує код c. Це дуже важливо для керування, а також може легко посилатися на інший рукописний код у c / c ++ / fortran. На сьогоднішній день це найбільш бажаний інструмент.

ctypes : ctypes дозволить вам записати свої функції в c, а потім швидко обернути їх своїм простим оформленням коду. Він обробляє весь біль від кастингу з PyObjects та керування гілом для виклику функції c.

Існують й інші підходи до написання вашого коду на C, але всі вони дещо більше для того, щоб взяти бібліотеку C / C ++ і упакувати її в Python.

Підходи лише для Python

Якщо ви хочете залишитися в Python здебільшого, моя порада - з’ясувати, які дані ви використовуєте, і вибрати правильні типи даних для реалізації ваших алгоритмів. Мій досвід, як правило, ви будете набагато далі, оптимізуючи свої структури даних, а потім будь-який низький рівень хакету. Наприклад:

numpy : контингентний масив дуже швидкий для швидких операцій масивів

numxpr : оптимізатор виразів масивного масиву. Він дозволяє виконувати багатопотокові вирази масивів numpy, а також позбавляється від численних тимчасових номерів, створених numpy через обмеження інтерпретатора Python.

blist : реалізація списку b-tree, дуже швидка для вставки, індексації та переміщення внутрішніх вузлів списку

панди : кадри даних (або таблиці) дуже швидка аналітика на масивах.

pytables : швидкі структуровані ієрархічні таблиці (наприклад, hdf5), особливо добре для обчислень із основними і запитами до великих даних.


3
Ви можете використовувати ctypes і для виклику процедур Fortran.
Меттью Емметт


Якщо говорити про пакувальний код, а як щодо f2py?
astrojuanlu

f2py - чудовий інструмент, який використовується багатьма в громаді. fwrap - це нещодавніша заміна, оскільки f2py показує свій вік, але насправді не повний.
aterrel

Спасибі! Це типи ресурсів, які я шукав. Мені було відомо лише про деякі з них, і лише мимохідь (або з перегляду їх в Інтернеті). Арон продовжує згадувати numxpr. Як це працює? Чи застосовуватиметься це?
Джефф Оксберрі

7

Перш за все, якщо є версія C або Fortran (функція MATLAB MEX?), Чому б вам не написати обгортку Python?

Якщо ви хочете, щоб ваша власна реалізація була не лише обгорткою, я настійно пропоную використовувати модуль numpy для лінійних матеріалів з алгебри. Переконайтеся, що він пов’язаний з оптимізованими блашами (наприклад, ATLAS, GOTOblas, uBLAS, Intel MKL, ...). І використовувати Cython або ткати. Прочитайте цю статтю Performance Python, щоб отримати гарне введення та орієнтир. Різні реалізації в цій статті доступні для завантаження тут люб’язно від Тревіса Оліфанта (Numpy-гуру).

Удачі.


Ця стаття Performance Python здається трохи датовою, в ній не згадуються деякі новіші інструменти, такі як numexpr.
Арон Ахмадія

Я дійсно не помітив numxpr. Було б непогано запустити те саме тестове місце з numxpr ...
GertVdE

Є чи до scipy.weaveцих пір використовується і розвивається? Здається, що стаття Performance Python показує, що вона може бути швидкою у використанні та дає досить гарне покращення швидкості, але я рідко бачив, щоб це згадувалося поза цією статтею.
Кен

@Ken: scipy.weave, наскільки я знаю, вже не знаходиться в активному розвитку. Він зберігається для зворотної сумісності, але нові проекти рекомендуються використовувати Cython.
GertVdE

Про GotoBLAS та NumPy / SciPy дивіться у der-schnorz.de/2012/06/optimized-linear-algebra-and-numpyscipy
AlexE

4

В основному я згоден з іншими відповідями. Найкращі варіанти для швидкого числового pythonкоду є

  • Використовуйте спеціалізовані бібліотеки на зразок numpy
  • оберніть наявний код, щоб ваша програма pythonмогла викликати його безпосередньо

Але якщо ви хочете запрограмувати весь алгоритм з нуля (я цитую: "Я використовую лише сирий Python"), тоді ви можете розглянути http://pypy.org/ реалізацію JIT (Just In Time) python. Я не зміг використати його для свого проекту (тому що це покладається numpyі pypyхлопці ретельно працюють над цим), але показники досить вражаючі ( http://speed.pypy.org/ )


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.