среда, 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 г.

Грация

среда, 26 марта 2008 г.

26.03.08

Решил сделать что-то более серьёзное на своей хомпаге чем одна html-страничка. Т.к. на моём бесплатном хосте, конечно, нет, любимого мною, питона, для использования django, хочу попробовать какой-нибудь php фреймворк. На хостинге в наличии имеется php за номером 4.

Когда-то давно немного пробовал cake-php, но после django, чего то он мне кажется унылым, возвращаться к нему уже не хочется. Возможно я не прав, не особо с ним разобрался.

Потом в памяти всплыл symfony, упоминаемый каким-то товарищем на лоре. Оказалось работает он только на PHP5, ну да ладно.

Пока остановился на CodeIgniter, на моём чудо-хосте он работает и, на первый взгляд, имеется вполне вменяемая документация. Посмотрим что из этого получится.

p.s. Одно время подумывал взять VPS в экспериментальных целях, за одно и хомпаг свой туда бы прицепил, на django, но пока на эту затею не решился. К сожалению, python не так распространён на хостингах как php... или может к счастью...



Ссылки на тему:
- Официальный сайт CodeIgniter'a
- Блог о CodeIgniter

четверг, 13 марта 2008 г.

Gnome 2.22 Released!

Уже с нами :) Надеюсь, как всегда, работает шустрее предыдущей версии. Жду появления в дебиановских репозиториях.
- Статус в Debian
- О выпуске

среда, 12 марта 2008 г.

Юзабилити

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

Закладная

Восстановление GRUB

Запускаем grub shell:
root@home:~# grub

Восстанавливаем загрузчик:
grub> find /boot/grub/stage1
(hd0,4)
grub>root (hd0,4)
grub>setup (hd0,4)

How To Compile A Kernel - Debian Way

Копируем конфиг текущего ядра:
cp /boot/config-`uname -r` ./.config

Делаем необходимые изменения:
make menuconfig

Собираем:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

Устанавливаем:
cd /usr/src
dpkg -i linux-image-2.6.23-custom_2.6.23-custom-10.00.Custom_i386.deb linux-headers-2.6.23-custom_2.6.23-custom-10.00.Custom_i386.deb