Повышение скорости Cython по сравнению с [закрытым] удобством использования

Я просто столкнулся с 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?

42
задан 23 April 2010 в 08:48
поделиться

4 ответа

В других ответах уже объяснялось, как вы просто компилировали код 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"

и скомпилировал его, я получил следующие времена:

  • Чистый код Python: 20,4553578737 секунд
  • Код Cython: 0,199339860234 секунды

Это ускорение в 100 раз. Не слишком потрепанный.

53
ответ дан 26 November 2019 в 23:36
поделиться

Cython - не другой интерпретатор. Он генерирует c-расширения для python из кода python (-подобного). cython test.pyx будет генерировать только файл test.c, который (после компиляции) может использоваться python, как обычная библиотека python.

Это означает, что вы измеряете только время, необходимое cython для перевода вашего кода python в c, а не то, насколько быстро выполняется эта версия вашего кода.

18
ответ дан 26 November 2019 в 23:36
поделиться
  • cython test.pyx фактически не запускается ваша программа. Двоичный файл cython предназначен для преобразования вашего кода Cython в модуль расширения Python. Вам нужно будет импортировать его в Python, чтобы запустить.

  • #! / Usr / bin / python не лучшая строка для скриптов Python. #! / Usr / bin / env python обычно является предпочтительным, который запускает все, что python запускает в командной строке.

    • Файлы Cython pyx , вероятно, вообще не должны иметь строки shebang, за исключением крайних случаев, когда они являются действительными программами Python.
  • У вас есть ошибка IndentationError в опубликованном коде.

  • Использование традиционного интерпретатора проще и портативнее. Cython надежен, но имеет свои ограничения и особенности. Может быть, было бы интересно использовать его намного больше, если бы он волшебным образом увеличил ускорение, и ваши тайминги заставят его выглядеть так, как есть, но на самом деле он дает меньшие. Вам нужно будет начать использовать специфические для Cython функции, чтобы использовать функции C, чтобы увидеть значительное ускорение.

9
ответ дан 26 November 2019 в 23:36
поделиться

Важный момент, который, похоже, отсутствует: Cython не является строгий надмножество Python. Есть некоторые функции, которые поддерживает Python, но не Cython. В первую очередь генераторы и лямбды (но они скоро появятся).

9
ответ дан 26 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: