banner

Бинарные модули с помощью Cython

Cython - подвид языка python, занимающийся работой с С/C++ модулями Python. У него есть очень полезная возможность трансляции python кода в С Api. С помощью него мы и будем создавать свои бинарные модули, скорость работы которых чуть быстрее, чем обычных python скриптов.
Пример трансляции Hello world в C код.
hello.py:

#coding:utf-8
print "Hello world"

Транслируем код:

cython hello.py


После выполнения данной команды получаем hello.c весом в целых 40кб.
Но пока это всего лишь C код, а не бинарный модуль.
Для того чтобы получить бинарный модуль нам поможет стандартный сборщик пакетов distutils.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
ext_modules = [Extension("hello", ["hello.py"])]
 
setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

Назовём его setup.py и выполним следующую команду:

python setup.py build_ext --inplace

На выходе в папке с вашим проектом получится C код и бинарный модуль .pyd.
Теперь это модуль можно импортировать как и обычные python файлы.
Данный модуль будет работать только под платформами, на которых он был собран.
Подробнее описано тут.

  • http://jezuz-chrizt.livejournal.com Крайст

    так.. и какое же этому мегакрутое применение, если кроссплатформенности нет?

  • http://klipner.ru rushter

    Вот когда встанет вопрос о скорости, тогда может и вспомнишь о возможности вставки c++ кода :) . Это всего лишь демонстрация автоматической трансляции в С.

  • http://jezuz-chrizt.livejournal.com Крайст

    А, для личного использования – согласен.
    И что, багов нет?

    Никаких косяков типа верски сайтов в дримвивере или Word’е, пардон за аналогию? =)

  • http://klipner.ru rushter

    Капризный очень, не все скрипты кушает :)