Psyco
Материал из Xgu.ru
Psyco — модуль для языка Python, предназначенный для повышения с помощью JIT-компиляции
производительности программ, в которых он используется.
Сейчас Psyco не развивается, хотя и широко используется. Автор сообщал, что собирается перенести идеи из Psyco в PyPy, потом было заявлено о работе над Psyco2[1].
Psyco позволяет повысить скорость исполнения программы в несколько раз (от 2 до 100, но в среднем в 4 раза [2]). Теоретически, производительность может быть повышена до уровня аналогичного кода на Си.
Psyco не требует никаких изменений в коде. Однако, некоторые конструкции он оптимизирует лучше. Например, циклы for...in циклы значительно медленнее циклов while. Первая конструкция в 17 раз быстрее чем вторая[3].
Цикл с использованием while (быстрее):
key = 0 while key < data.length: val = data[key] key += 1
Цикл с использованием for...in (медленнее):
for key,val in enumerate(data): val
[править] Использование
Инсталляция (для Debian):
%$ apt-get install python-psyco
Задача: найти количество подряд идущих пар чисел до миллиона, у которых количество делителей одинаково.
Решение:
#!/usr/bin/python import psyco psyco.full() def main(): s=0 N=10000000 a=[0]*(N+1) for i in range(1,N+1): for j in range(1,(N+1)/i+1): if i*j<=N: a[i*j]+=1 if a[i]==a[i-1]: s+=1 return s print main()
Включение Psyco выполняется всего лишь двумя строчками:
import psyco psyco.full()
Время исполнения с Psyco:
$ time python 179.py 986262 real 0m12.346s user 0m12.077s sys 0m0.072s
Время исполнения без Psyco:
$ time python 179.py 986262 real 1m43.455s user 1m42.178s sys 0m0.696s
Различие в производительности почти в 10 раз:
$ echo 103.45/12.346 | bc -l 8.379
[править] Дополнительная информация
На главной странице проекта появилось сообщение, датируемое "12 March 2012": Psyco is unmaintained and dead. Please look at PyPy for the state-of-the-art in JIT compilers for Python.
В репозиториях Debian данный пакет присутствует только в ветке squeeze (oldstable)
[править] Примечания
- ↑ http://codespeak.net/pipermail/pypy-dev/2009q3/005288.html
- ↑ http://psyco.sourceforge.net/introduction.html
- ↑ https://www.pooryorick.com/secure/wiki/Pub/Psyco