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

Я только что наткнулся на Cython, когда искал способы оптимизировать код Python. Я читал различные сообщения на Stack Overflow, вики 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)

$ время python test.pyx

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

$ время cython test.pyx

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

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


person Community    schedule 23.04.2010    source источник
comment
Вы измеряете время выполнения скрипта Python по сравнению со временем компиляции некоторого кода Cython. Это не имеет смысла.   -  person Sturla Molden    schedule 28.03.2014
comment
Что касается вашего последнего замечания: это в основном то, что Джулия пытается сделать: сделать оптимизированный транслятор кода низкого уровня на согласованном машинном языке высокого уровня и четко показать это намерение с самого начала, чтобы оно получило больше поддержки, даже если это означает что некоторые функции высокого уровня теряются таким образом, как динамическая типизация.   -  person gaborous    schedule 16.03.2015
comment
@SturlaMolden: Разве это не тест на интерпретацию Python и копирование и выполнение Cython? Если это так, то это имеет смысл.   -  person Eddy    schedule 21.06.2017
comment
@Eddy Нет, потому что компиляцию Cython нужно выполнить только один раз, это можно сделать даже заранее. Интерпретация байт-кода Python происходит при каждом вызове, и, подобно компиляции байт-кода Cython, ее нужно выполнить только один раз. Таким образом, Benchmarks нуждается в цикле приработки, чтобы избавиться от этих постоянных накладных расходов, которые происходят при первом вызове.   -  person Sturla Molden    schedule 15.05.2021


Ответы (7)


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

person Justin Peel    schedule 23.04.2010
comment
Возможно, это происходит за счет правильности. Код Python вычисляет правильное значение i ** 2. Код C переполняется для большинства чисел, для которых вы выполняете операцию, если вы компилируете 32-битный код. (Если он вообще выполняет операцию. Вполне возможно, что ваш компилятор C полностью оптимизирует операцию.) Вероятно, это некорректное сравнение. Вы также не дали полной ясности, что вы бежите, как вы это делаете и в какое время вы отдаете это время. - person Mike Graham; 23.04.2010
comment
Кстати, именно это я и имел в виду под причудами. Я почти привел пример переполнения, например, когда код Python автоматически выполняет проверки, обеспечивающие правильность, и такие, которые в C не дали бы результата. - person Mike Graham; 23.04.2010
comment
Ты прав. Я думал о переполнении, пока делал это, но поленился, потому что знал, что в данном случае это не имеет большого значения. Я исправлю это, чтобы использовать длинные длинные. - person Justin Peel; 23.04.2010
comment
@JustinPeel У меня есть сообщение Cython Вы можете дать представление о. - person Phillip; 01.02.2017
comment
Хорошее объяснение. Но как он отвечает на вопрос? ›››Если cython так хорош, то почему люди до сих пор используют традиционный интерпретатор Python? Есть ли проблемы с надежностью Cython? - person Elad Weiss; 12.06.2020

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

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

person Steven    schedule 23.04.2010
comment
Да, для тех, кто хочет, чтобы cython действительно скомпилировал и запустил вашу программу в одну строку, я создал runcython (github.com/ russell91/runcython). runcython test.pyx будет иметь семантику, предусмотренную OP. - person RussellStewart; 19.11.2014

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

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

    • Cython pyx files probably shouldn't have a shebang line at all, except in the corner case they are valid Python programs.
  • У вас есть ошибка IndentationError в опубликованном коде.

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

person Mike Graham    schedule 23.04.2010

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

person carl    schedule 08.06.2010
comment
Вы не знаете, пришли ли они еще? - person Janus Troelsen; 08.06.2013

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

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

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

person unixman83    schedule 15.12.2010
comment
Вы можете освободить GIL, когда он не нужен. Это когда вы не используете Python C API. В Cython это написано как с nogil:, и вы получите ошибку, когда выпуск GIL небезопасен. Потоки Python — это родные потоки ОС, которые дадут вам параллелизм при выпуске GIL. Это верно как для Python, так и для Cython. - person Sturla Molden; 28.03.2014

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

person RussellStewart    schedule 20.03.2015

Как и многие комментарии, предполагающие, что время, которое вы упомянули с помощью cython, - это просто время, затраченное на преобразование файла .py в файл .c. Этот файл .c будет занимать много памяти. Преимущество заключается в том, что вы также можете скомпилировать этот файл .c с помощью компилятора C.

Я приведу вам один пример: если у вас есть файл Python, нам нужно сохранить его как файл .pyx. Запустив "cython xyz.pyx", будут созданы файлы .c и .so.

Давайте проверим на картинке файлы, созданные командой cython

Размер также увеличивается, в моем случае он изменился с Bytes на Kb.

Существует определенный метод компиляции кода Python, на который вы можете ссылаться по этим ссылкам:

http://cython.readthedocs.io/en/latest/src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

еще одна вещь, которую я заметил, это то, что они не упоминают проблемы с памятью в cython. Когда я пытаюсь реализовать в своем встроенном проекте. Я сталкиваюсь с множеством проблем с памятью.

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

Обратитесь к картинке: сравните время между python и pypy

Спасибо..

person Kusalkumar    schedule 03.04.2018