Програмски језикCython је надскуп Пајтона са интерфејсом стране функције за позивање C/C++ рутина и способношћу да декларише статични тип подрутинских параметара и резултата, локалних променљивих, и својстава класа.[1][2]
Преглед
Cython је компајлован језик који генерише модуле екстензија CPython-а. Ови модули екстензија онда могу бити учитани и коришћени од стране обичног Пајтон кода коришћењем import наредби. Cython је написан у Пајтону и ради на системима Microsoft Windows, Линукс, и Mac OS X, производећи изворне фајлове компатибилне са CPython 2.4 до 3.4.
Ради тако што производи стандардан Пајтон модул. Али, понашање се разликује од стандардног Пајтона у том модулу кода, првобитно написаног у Пајтону, је преведен у C. Док је резултујући код брз, он прави пуно позива у CPython интерпретатору и користи CPython стандардне библиотеке да изврше сав посао. Овакав начин рада је сачувао прилично доста времена у развоју Cython-а, али модули имају зависност на Пајтон интерпретатор и стандардну библиотеку.
Иако је већина кода заснована на C-у, мали део лоудера написан у интерпретатору Пајтона је обично неопходан (осим ако је циљ да се направи лоудер потпуно написан у језику C, што може захтевати рад са недокументованим унутрашњостима CPython-а). Али, ово није главни проблем због присуства интепретатора Пајтона.
Пример програма
Пример hello world програма за Cython је сложенији него у другим језицима јер долази у додир са Пајтон C АПИ и distutils екстензијом. Барем три фајлова је потребно за основни пројекат:
setup.py фајл да позове distutils процес који генерише модулациону екстензију
Главни пајтон програм да учита модулациону екстензију
Cython изворне фајлове
Следећи код демонстрира процес градње и покретања:
# hello.pyx - Python Module, this code will be translated to C by Cython.defsay_hello():print"Hello World!"
# launch.py - Python stub loader, loads the module that was made by Cython.# This code is always interpreted, like normal Python.# It is not compiled to C.importhellohello.say_hello()
# setup.py - unnecessary if not redistributing the code, see belowfromdistutils.coreimportsetupfromCython.Buildimportcythonizesetup(name='Hello world app',ext_modules=cythonize("*.pyx"))
Cython је дериват језика Пирекс, и подржава више карактеристика и оптимизација него Пирекс.[3][4]
Cython је форкован из Пирекса током 2007. од стране програмера Сејџ пакета компјутерске алгебре, јер нису били задовољни Пирексовим ограничењима и нису могли добијати закрпе прихваћене од Пирексовог одржаваоца Грега Евинга, који је имао представу о много мањем обиму свог алата него што су то Сејџ програмерили мислили. Они су затим форковали Пирекс као SageX. Када су сазнали да људи преузимају Сејџ само да би добили SageX, и програмери других пакета (укључућуји Стефана Бехнела, који је одржавао XML библиотеку LXML) су такође одржавали форкове Пирекса, SageX се поделио на Сејџ пројекат и уврстио са cython-lxml да постане Cython.[5]
Пример
Cython фајлови имају .pyx екстензију. На први поглед, Cython код изгледа идентично као код Пајтона. Али, тамо где Пајтон је динамично написан, у Cython-у, уписивање може бити опционо обезбеђено, омогућавајући унапређене перформансе, дозвољавајући петље да буду конвертоване у C петље када је то могућеl. На пример:
defprimes(intkmax):# The argument will be converted to int or raise a TypeError.cdefintn,k,i# These variables are declared with C types.cdefintp[1000] # AnotherCtyperesult=[]# A Python typeifkmax>1000:kmax=1000k=0n=2whilek<kmax:i=0whilei<kandn%p[i]!=0:i=i+1ifi==k:p[k]=nk=k+1result.append(n)n=n+1returnresult
Статични типови декларација и Перформансе
Cython програм који имплементира исти алгоритам као и одговарајући Пајтон програм може трошити мање рачинарских ресураса као што су меморија и циклуси процесовања због разлика између CPython-а и Cython модела извршења. У једну руку, основни Пајтон програм је учитан и извршен од стране CPython виртуалне машине, тако да и време покретања као и сам програм троше ресурсе. У другу руку, Cython програм је компајлован у коду C-а, који је даље компајлован у машински код, тако да виртуелна машина се само користи привремено када се програм учитава.[6][7][8][9]
Пошто је C осредњи језик по тежини, перформансе ће зависити од C компајлера.
Коришћеност
Cython је посебно популаран код научних корисника Пајтона,[8][12][13] где има "савршену публику" према речима Пајтон програмера Гвидо ван Росум.[14] Истакнујући:
Бесплатан софтвер Сејџ система компјутерске алгебре зависи од Cython-а, и за перформансе и за додиривање са другим библиотекама.[15]
Већи део научно компјутерских библиотека SciPy, pandas и scikit-learn су написани у Cython-у.[16][17]
Неки популарни сајтови као што је Quora користе Cython[18]
Cython-ов домен није ограничен само на нумеричко израчунавање. На пример, lxml XML алатка је написана највише у Cython-у, и као његов претходник Пирекс, Cython се користи да се обезбеди Пајтону бајндинг за многе C и C++ библиотеке као што је библиотека размењеивања порука ZeroMQ.[19] Cython такође може бити коришћен да се направи паралелна обрада за машине вишејезгарних процесора; ова карактеристика користи библиотеку OpenMP.
^Says Sage and Cython developer Robert Bradshaw at the Sage Days 29 conference (22. 3. 2011). „Cython: Past, Present and Future”. youtube.com. Приступљено 5. 5. 2011.
^Behnel, Stefan; Bradshaw, Robert; Citro, Craig; Dalcin, Lisandro; Seljebotn, Dag Sverre; Smith, Kurt (2011). „Cython: The Best of Both Worlds”. Computing in Science and Engineering. 13 (2): 31—39. doi:10.1109/MCSE.2010.118. Архивирано из оригинала 05. 01. 2017. г. Приступљено 29. 10. 2015.
^ абSeljebot, Dag Sverre (2009). „Fast numerical computations with Cython”. Proceedings of the 8th Python in Science Conference (SciPy 2009): 15—22. Архивирано из оригинала 19. 07. 2011. г. Приступљено 29. 10. 2015.
^Millman, Jarrod; Aivazis, Michael (2011). „Python for Scientists and Engineers”. Computing in Science and Engineering. 13 (2): 9—12. doi:10.1109/MCSE.2011.36.