Подтвердить что ты не робот

Cython Speed ​​Boost против удобства использования

Я просто наткнулся на Cython, в то время как я искал способы оптимизации кода Python. Я читал различные сообщения о stackoverflow, вики python и читал статью "Общие правила оптимизации".

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)

$time python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$time cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

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

4b9b3361

Ответ 1

Другие ответы уже объяснили, как вы просто составляли код 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-кратное ускорение. Не слишком потрепанный.

Ответ 2

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

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

Ответ 3

  • cython test.pyx фактически не запускает вашу программу. Бинарный код cython предназначен для обработки вашего кода Cython в модуль расширения Python. Вам нужно будет импортировать его в Python для его запуска.

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

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

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

Ответ 4

Большая точка, которая, кажется, отсутствует: Cython не является строгим надмножеством Python. Есть некоторые функции, поддерживаемые Python, но Cython этого не делает. Наиболее заметно, генераторы и лямбды (но они идут).

Ответ 5

  • Самая большая причина, по которой Cython не так популярен, заключается в том, что ей не хватает автономных (без python) исполняемых файлов.

  • Отсутствие гласности. Разработчики, похоже, больше интересуются учеными в разработке своего Sage-программного обеспечения, чем передовой язык.

  • Ловушки, встречающиеся во время разработки. Я столкнулся с недостатком поддержки истинных потоков. Все обернуто в глобальную блокировку интерпретатора, делая его потокобезопасным, но отключая concurrency!

Ответ 6

Для тех, кто хочет, чтобы этот cython действительно скомпилировал и запускал вашу программу в одной строке, я создал runcython (http://github.com/russell91/runcython). runcython test.pyx будет иметь семантику, которую OP предполагал