Полазив по и-нету и собрав первичный(т.е. не исчерпывающий) материал - я решил сделать эту статью напоминалку.
Это, так сказать, заготовка для полной статьи для хабрахабра - как более профилированного ресурса по подобным темам.
Не обижусь если на хабре напишет эту статью не я, при условии, что это будет не чистая копия(так я и сам мог бы запостить),
а по крайней мере отрицензированная и проверенная на орф-е ошибки версия.
А по хорошему - дополненная, c логотипчиками проектов, проверенная и желательно переписанная литератерным языком версия.
в процессе написания этой статьи наткнулся на аналогичную темуНе обижусь если на хабре напишет эту статью не я, при условии, что это будет не чистая копия(так я и сам мог бы запостить),
а по крайней мере отрицензированная и проверенная на орф-е ошибки версия.
А по хорошему - дополненная, c логотипчиками проектов, проверенная и желательно переписанная литератерным языком версия.
Вобщем: если вы можете дополнить тему - обязательно пиши, а я буду их в этот список добавлять.
Поехали:
Немного о том "как Python запускается и работает":
1. Компиляция py-файлов в байт-код(кеширование байт-кода в pyc/pyo-файлах) посредством: CPython, Jython, IronPython, Brython, RubyPython,...
2. Интерпретация байт-кода(виртуальной машиной) - в машинный код под конкретную архитектуру посредством: CPython VM, JVM, CLR, Ruby VM,...
по сути это JIT.
Все(если что-то упустил - поправляйте) способы ускорения Python(CPython):
(сортировка списка - произвольная)стандартные средства ускорения python
стандартные - как я посчитал. А вообще вопрос об их стандартности открыт1. опимизация кода посредством понимания самого языка
еще пример
2. компиляция текстовых py-файлов в pyc-файлы(байт-код)
2.2. компиляция py-файлов с ключами -O и -OO в оптимизированный байт код pyo-файлы.
3. Numpy - Numerical Python расширение python для быстрой работы с массивами(типа MATLAB).
Суть: пакет реализует удобную работу с массивами + ускорение(но как по мне - он мог бы работать быстрее) 4. переход на python 3 - ускоряет работу программ.
Тип decimal в Python 3 он стал работать в 20-120 раз быстрее, так как переписан с Python на С.
Улучшенный GIL - означает лучшую работу с многопоточностью стандартными средствами языка (без необходимости подключения специальных фич типа parallel python)
Реализованы аннотации(т.е. явное, необязательное объявление типов) данных - которые, как я думаю, будут использованы на этапе компиляции в машинный код для ускорения.
Но эту инфу нужно подтвердить, т.к. в док-ии сказано что их назначении в другом(но использовать аннотации еще и для ускорения - было бы очень логично, как мне кажется).
...
проекты компиляции в С и/или использующие С-библиотеки:
1. ускорение посредством Cython.Cython - это специальный язык программирования. По сути это тот же Python, но в котором типы данных можно объявлять явно.
Предок Cython - это Pyrex.
Способы использования:
1.1. pyx-файлы. В них для компилятора Cython - явно указываются типы данных использованы в Python скрипте.
1.2. компиляция через setup
1.3. компиляция налету
2. ctypes - библиотека для python, позволяющая подключать C-библиотеки(и не только...)
отличная статья с примером и тестами скорости
3. Shed skin - транслятор Python в оптимизированное C++ представление. Может транслировать только статические типы данных приложений на Python в код C++. Может генерировать как самостоятельные приложения, так и модули расширения, которые могут быть импортированы в большие приложения на языке Python.
Важным достоинством проекта, является возможность быстрой разработки программ на высокоуровневом языке программирования (Python), с последующей трансляцией кода в C++, что после компилирования, позволяет увеличить быстродействие созданных приложений.
Главное отличие от проекта PyPy, Shed Skin позволяет сэкономить оперативную память.
4. pyinline - позволяет запускать сторонний код(не обязательно Сишный) внутри питоновского скрипта.
Домашняя страница проекта + пример
5. weave - позволяет запускать Си-шный код внутри питоновского скрипта. Является под-проектом SciPy.org
очень коротко о проекте
6. Проект HOPE - HOPE представляет собой JIT-компилятор, оформленный в виде модуля на языке Python, транслирующий специально отмеченные блоки кода в представление на языке C++ и на лету компилирующий их в машинный код. При первом запуске Python-скрипта при помощи пакета setuptools и штатного C++ инструментария выполняется компиляция HOPE-блоков в форму разделяемой библиотеки, после чего результат кэшируется при последующих вызовах. Обрабатываемые при помощи HOPE функции помечаются специальным декоратором "@jit" или вызываются с использованием функции jit().
Разработчики из Института астрономии и исследовательской лаборатории космологии Швейцарской высшей технической школы Цюриха открыли исходные тексты проекта HOPE, разработанного для ускорения выполнения программных систем на языке Python, используемых для астрономических вычислений.
Подробнее о проекте на русском7. Boost - библиотека инноваций(написана на С++).
Позволяет выполнять код на С++ из Python и наоборот(пример).
А еще у нее есть модуль реализующий многопоточность(см. далее).
8. Nuitka is a Python compiler.
Right now Nuitka is a good replacement for the Python interpreter and compiles every construct that CPython 2.6, 2.7, 3.2, 3.3 and 3.4 offer.
It translates the Python into a C++ program that then uses "libpython" to execute in the same way as CPython does, in a very compatible way.
9. SWIG - свободный инструмент для связывания программ и библиотек, написанных на языках C и C++, с интерпретируемыми (Tcl, Perl, Python, Ruby, PHP) или компилируемыми (Java, C#, Scheme, OCaml) языками.
ускорение путем многопоточности
Многопоточность бывает посредством:
[*] программного запуска в несколько потоков((см.так же MPI - Message Passing Interface))
[*] многопроцессорная или многоядерная(в одном проце) многопоточность или распределенная в кластер(см.так же SMP - Symmetric multiprocessing)
[*] многопоточность посредством многоядерности графического процессора (например CUDA,...)
Итак:
1. OpenACC - стандарт, описывающий набор директив для написания гетерогенных программ, задействующих как центральный, так и графический процессор.
Этот набор библиотек старается использовать все доступные технологии: CUDA, MPI, SMP,...
Например: позволяет путем вставки пары препроцессорных инструкций в с-код(python-код?) - автоматически выполнять его на GPU(CUDA).
2. CUDA - программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы Nvidia.
Т.е. эта фица доступна только для видеокарт Nvidia. (у кого - не Nvidia - может купить специальный внешнее устройство Nvidia)
pyCUDA - использование CUDA в питоне
NumbaPRO - High-Performance Python with CUDA Acceleration.
3. Stackless - патчи к Python для многопоточности.
Далее цитаты взял отсюда, там же есть пример.
"Stackless Python — это усовершенствованная версия интерпретатора Python. Она позволяет программисту пользоваться преимуществами многопоточного программирования без снижения производительности на примитивах синхронизации и без проблем с «гонками» (race conditions). "
"С точки зрения программиста, создание тасклета (микропотока в терминах Stackless) ничем не отличается от создания нового потока операционной системы: stackless.tasklet(your_func)(1, 2, 3)."
4. parallel python - он же PP. Далее цитата: "PP is a python module which provides mechanism for parallel execution of python code on SMP (systems with multiple processors or cores) and clusters (computers connected via network). "
А вот пример применения с хабры
5. Pypar - is an efficient but easy-to-use module that allows programs written in Python to run in parallel on multiple processors and communicate using message passing. Pypar provides bindings to a subset of the message passing interface standard MPI.
6. pyMPI - project integrating the Message Passing Interface (MPI) into the Python interpreter.
7. Boost - библиотека инноваций(написана на С++).
Для python есть Boost.python. В составе этой библиотеки есть модуль Boost.MPI - реализующий многопоточность.
смотрим libboost-mpi-python1.40.0 из библиотеки boost1.40 для Ubuntu
пример использования из документации
Код: Выделить всё
import boost.mpi as mpi
print "I am process %d of %d." % (mpi.rank, mpi.size)
9. другие примеры реализации многопоточности в python используя Cython, Numa, NuPy в сравнении с C++
проекты использующие LLVM и JIT
LLVM для трансляции Python код в байт-код(IR), а затем JIT компилирцет его в машинны код.Но заодно: кеширует часто используемые участки, запоминает типизацию, строит структуру процессов,... вобщем делает все чтобы работало быстрее.
//-----------------------------------------------------------------------------------------------------------------
1. Numba - еще один компилятор Python спонсируемый фирмой Continuum Analytics, Inc
Эту штуку очень пиарят в разных частях и-нета как весьма перспективную.
В отличие от Cython - нумба может самостоятельно определять типы использованных в python-e данных(пример).
А еще в Numba можно реализовать многопоточность и процессорную и графическую(см. NumbaPRO).
Рекомендую отличные статьи сравнения скоростей Numba и Cython: статья 1, продолжение часть 2
Не понимаю зачем фирма Continuum Analytics, Inc влила деньги в разработку Numba,
если она могла влить деньги в уже готовый PyPy и получила бы на много больше...?
2. Psyco - JIT-компилятор языка Python. Проект закрыт и устарел. если она могла влить деньги в уже готовый PyPy и получила бы на много больше...?
Вместо него на странице самого проекта Psyco - рекомендуют использовать PyPy.
тут в wiki написано "PyPy является продолжением проекта Psyco, JIT-компилятора для Python",
хотя тут в wiki написано "Существуют реализации языка Python, вводящие высокопроизводительные виртуальные машины (ВМ) в качестве бэк-энда компилятора. Примерами таких реализаций может служить PyPy, базирующийся на LLVM; более ранней инициативой является проект Parrot.".
Т.е. можно ошибочно прийти к вводу что предком PyPy является виртуальная машина Parrot.
3. PyPy - особый интерпретатор языка программирования Python(не путать с PyPI - Python Package Index) 4. Numexpr использует собственную виртуальную машину, написанную на C, и собственный JIT компилятор.
Это позволяет ему принимать простые математические выражения в виде строки, компилировать и быстро вычислять.
Но ка ни странно: мало информации о проекте. Даже на вики статьи нет!
5. Pyston - Pyston is a new, under-development Python implementation built using LLVM and modern JIT techniques with the goal of achieving good performance.
сайт pyston.org
Другие возможности ускорения
1. PyASM - Pyasm является полнофункциональным динамический ассемблером, полностью написан на языке Python. К динамическим, в смысле, что он может быть использован для создания и выполнения машинного кода в Python во время выполнения, без необходимости генерации объектных файлов и линковки.2. PyASM2 - (далее как я понял) Assembler для Python для архитектуры х86, SSE и SSE2 (компилируемый виртуальной машиной Java(JVM)? ... но тогда это не питон, а Jython...?).
Не очень разобрался, но очень интересная штука! На сайте написано, что этот проект - "не потомок проекта pyASM или Pyasm".
В описании написано "pyasm2 - x86 assembler library (C) 2012 Jurriaan Bremer"
"Java Disassembler & Assembler Engine (C) 2012 Jurriaan Bremer"
3. для решения проблем с GIL рекомендуют использование IronPython или Jython, лишённых этой особенности классического Python.
4. проект Unladen Swallow - который поначалу поддерживался сотрудниками Google, приказал долго жить. Поэтому его стоит обходить стороной, а информацию по нем считать безнадежно устаревшей.
Связанные проекты
Нижеперечисленные проекты - не являются ускорителями python,но они имеют (опосредованное) отношение к теме - поэтому часто встречаются в поиске по теме ускорения python
(в частности я решил их описать чтобы отделить мух от меда. Так вот дальше будут мухи...)
IPython - интерактивная оболочка для языка программирования Python.
Pychecker - поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки.
Pylint призван решать задачи близкие Pychecker, но имеет уклон в сторону проверки стиля кода, поиска кода с запашком.
CProfile, profile, hotshot - модули питона служащие для сбора и анализа статистики работы программ на питоне. Например перед применением тяжелой артилерии типа PyASM - не кисло было бы провести оптимизацию python кода. Элементарно посмотреть какая часть кода выполняется дольше всего, можно ли ее переписать более оптимально?
Anaconda пакет всего полезного для серьезной работы с питоном (conda, SciPy, Pandas, IPython, Matplotlib, Blaze, Boken,...).
Но этот пакет ставит свой питон и меняет для текущего пользователя ссылки переменных окружения с системного питона на питон в папке анаконды. Это чревато тем что новый питон не увидит установленных в системе дополнений в папках /usr/share/pyshare и других... Например мой скрипт image-to-gcode.py перестал видеть модули gcode, rs274, numpy, и многое другое... я это решил так:
дополнительные строчки в коде(хотя это вроде как не фэншуйно):
Код: Выделить всё
import sys
sys.path.insert(0, "/usr/lib/pymodules/python2.7")
LibJIT - библиотека для JIT-компиляции, позволяет компилировать фрагменты байт кода в машинный код во время исполнения программ.
Дизайн библиотеки Libjit содержит обширный набор средств, которые заботятся о процессе компиляции во время выполнения программы, не связывая программиста с языком или специфическими особенностями байт-кода.
В отличие от других систем, таких как JVM, .NET, Parrot и LLVM, LibJIT — это фундамент для создания виртуальных машин, динамических скриптовых языков.
Цель проекта LibJIT состоит в том, чтобы обеспечить набор средств компиляции на лету, не связывая программиста с языковыми специфическими особенностями.
Для себя выбрал более подробно присмотреться к: CUDA, Numba, PyPy, PyASMx, ctypes, оптимизация средствами самого языка и компиляция с ключами -ОО (попробовал Cython - результат меня неудовлетворил)