Я просто столкнулся с Cython, в то время как я высматривал способы оптимизировать код Python. Я читал различные сообщения на stackoverflow, Python Wiki и прочитал статью "General Rules for Optimization".
Cython - что-то, что схватывает мой интерес больше всего; вместо того, чтобы писать C-код для себя, можно принять решение иметь другие типы данных в коде Python самом.
Вот глупый тест, который я попробовал,
#!/usr/bin/python
# test.pyx
def test(value):
for i in xrange(value):
i**2
if(i==1000000):
print i
test(10000001)
Python времени $ test.pyx
real 0m16.774s
user 0m16.745s
sys 0m0.024s
Цитон времени $ test.pyx
real 0m0.513s
user 0m0.196s
sys 0m0.052s
Теперь, честно, я ошеломлен. Код, который я использовал здесь, является чистым кодом Python и всем, что я изменил, интерпретатор. В этом случае, если цитон является этой пользой, то, почему люди все еще используют традиционного межпретора Python? Есть ли какие-либо проблемы надежности для Cython?
В других ответах уже объяснялось, как вы просто компилировали код Cython, а не выполняли его. Однако я подумал, что вы, возможно, захотите узнать, насколько быстрее Cython может сделать ваш код. Когда я скомпилировал код, который у вас есть (хотя я запускал функцию из другого модуля) с distutils
, я получил очень незначительный прирост скорости по сравнению с обычным Python - около 1%. Однако, когда я добавил несколько небольших изменений в ваш код:
def test(long long value):
cdef long long i
cdef long long z
for i in xrange(value):
z = i**2
if(i==1000000):
print i
if z < i:
print "yes"
и скомпилировал его, я получил следующие времена:
Это ускорение в 100 раз. Не слишком потрепанный.
Cython - не другой интерпретатор. Он генерирует c-расширения для python из кода python (-подобного). cython test.pyx
будет генерировать только файл test.c, который (после компиляции) может использоваться python, как обычная библиотека python.
Это означает, что вы измеряете только время, необходимое cython для перевода вашего кода python в c, а не то, насколько быстро выполняется эта версия вашего кода.
cython test.pyx
фактически не запускается ваша программа. Двоичный файл cython
предназначен для преобразования вашего кода Cython в модуль расширения Python. Вам нужно будет импортировать его в Python, чтобы запустить.
#! / Usr / bin / python
не лучшая строка для скриптов Python. #! / Usr / bin / env python
обычно является предпочтительным, который запускает все, что python
запускает в командной строке.
pyx
, вероятно, вообще не должны иметь строки shebang, за исключением крайних случаев, когда они являются действительными программами Python. У вас есть ошибка IndentationError в опубликованном коде.
Использование традиционного интерпретатора проще и портативнее. Cython надежен, но имеет свои ограничения и особенности. Может быть, было бы интересно использовать его намного больше, если бы он волшебным образом увеличил ускорение, и ваши тайминги заставят его выглядеть так, как есть, но на самом деле он дает меньшие. Вам нужно будет начать использовать специфические для Cython функции, чтобы использовать функции C, чтобы увидеть значительное ускорение.
Важный момент, который, похоже, отсутствует: Cython не является строгий надмножество Python. Есть некоторые функции, которые поддерживает Python, но не Cython. В первую очередь генераторы и лямбды (но они скоро появятся).