среда, 4 февраля 2009 г.

Python и оптимизация скорости его работы

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

Но существует несколько способов увеличить производительность, одними из которых является использование Psyсo или Pyrex. Для их сравнения и написан этот пост.

Во всех тестах мы будем искать все простые числа, которые меньше 50000.

Первый тест — никакой оптимизации, чистый python:
def primes(kmax):
result = []
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % result[i] != 0:
i = i + 1
if i == k:
k = k + 1
result.append(n)
n = n + 1
return result
primes(50000)
Имеем ~271 секунду:

real 4m31.119s
user 4m27.525s
sys 0m0.600s

Во втором тесте используем модуль Psyco, суть которого заключается в замене во время исполнения части интерпретируемого байткода оптимизированным машинным кодом. Работает он только на x86 Существует два варианта его применения — на весь код или на определённую функцию. Для нашего теста применялся первый вариант, нужно просто добавить в начале файла эти две строки:

import psyco
psyco.full()

Результат:

real 0m13.790s
user 0m13.733s
sys 0m0.016s

Т.е. скорость работы увеличена примерно в 20 раз относительно первого варианта.

В третем и последнем тесте для увеличение производительности используем Pyrex — специальный язык, похожий на python, предназначеный для написания модулей для python. Разработчики обещают, что скорость модулей написанных на их детище приближается к аналогам на С. Наша функция на pyrex имеет такой вид, взята на официальном сайте pyrex:
def primes(int kmax):
cdef int n, k, i
cdef int p[50000]
result = []
if kmax > 50000:
kmax = 50000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] <> 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
Для сборки модуля используем специальный скрипт:

from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext
setup(
name = "prime",
ext_modules=[
Extension("prime", ["prime.pyx"], libraries = [])
],
cmdclass = {'build_ext': build_ext}
)
И собираем такой командой:

python setup.py build_ext —inplace

Результат:

real 0m4.346s
user 0m4.328s
sys 0m0.008s

Pyrex оказался примерно в 67 раз быстрее первого и в 3 раза быстрее второго примера.

Такие вот интересные результаты.

Psyco
Pyrex

четверг, 11 декабря 2008 г.

Сборка ядра на 2х ядерных процессорах

После покупки нового железа, само собой, тут же поставил на него дебиан. Как всегда для работы инета понадобилось собрать ядро с поддержкой mppc(привет моему провайдеру ;) ), было интересно сравнить по скорость сборки старый P4 2.4Ггц и новый, шустрый core 2 duo e8400 3Ггц.

Собираю ядро, как написано здесь.

На старом железе на это уходило немногим более часа, на новом - ~17 минут. Отличный результат!

hint: На многоядерных системах запускаем сборку так:

CONCURRENCY_LEVEL=2 fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

где CONCURRENCY_LEVEL равно количеству ядер.

хм...

"…Финский залив в феврале. Лед и снег. Направо — Кронштадт, налево — Ораниенбаум. Из Кронштадта едет извозчик. Пересекая ему путь, плывет ледокол. Извозчик в отчаянии. Если ледокол «Ленин» пройдет раньше, чем тот успеет проскочить, дорога будет испорчена на несколько часов. И извозчик мчит вовсю, натыкаясь на форштевень парохода. Где еще, кроме России, вы увидите столкновение парохода с извозчиком?.."
Журнал "Огонёк" №1 за 1927 г

суббота, 19 апреля 2008 г.

Хорошая статья о реализации многопоточности в Python

Читаем

вторник, 15 апреля 2008 г.

Синхронизация nokia 6630 с Linux

В прошлом году занимался этой проблемой, нашёл obextool - морда для obexftp - выглядит ужасно(оно на Tk), русские файлы и файлы в пути к которым есть кириллица не заливает(проблема самого openobex) и вообще глюкалово, но альтернативы не было, пришлось юзать его.

Но месяца 2 назад я начал интересоваться Python и появилась у меня дикая мысль - написать морду под obexftp для файлообмена с моим телефоном, раньше десктопный софт не писал. На скрине то, что получилось.



Мало того что оно работает, заливает русские файлы, транслитерирует имена файлов на лету, так ещё и выглядит, по-моему, не плохо :).

суббота, 5 апреля 2008 г.

5.04.08

Да... Codeigniter пришлось пока отложить, появилась работка небольшая...

Забавное ЖЖ компьюнити

понедельник, 31 марта 2008 г.

Грация