Пређи на садржај

Cython

С Википедије, слободне енциклопедије
Cython
Лого
Оригинални називенгл. Cython
Изговара сеСајтон
Моделпрограмски језик
Аутор(и)Роберт Бредшо, Стефан Бехнел
ЛиценцаApache Лиценца
Веб-сајтhttp://cython.org

Програмски језик 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 in Cython

Пример hello world програма за Cython је сложенији него у другим језицима јер долази у додир са Пајтон C АПИ и distutils екстензијом. Барем три фајлова је потребно за основни пројекат:

  •  setup.py фајл да позове distutils процес који генерише модулациону екстензију
  • Главни пајтон програм да учита модулациону екстензију
  • Cython изворне фајлове

Следећи код демонстрира процес градње и покретања:

# hello.pyx - Python Module, this code will be translated to C by Cython.
def say_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.

import hello
hello.say_hello()
# setup.py - unnecessary if not redistributing the code, see below
from distutils.core import setup
from Cython.Build import cythonize

setup(name = 'Hello world app',
      ext_modules = cythonize("*.pyx"))

Ове команде граде и покрећу програм:

$ python setup.py build_ext --inplace
$ python launch.py

Историја

[уреди | уреди извор]

Cython је дериват језика Пирекс, и подржава више карактеристика и оптимизација него Пирекс.[3][4]

Cython је форкован из Пирекса током 2007. од стране програмера Сејџ пакета компјутерске алгебре, јер нису били задовољни Пирексовим ограничењима и нису могли добијати закрпе прихваћене од Пирексовог одржаваоца Грега Евинга, који је имао представу о много мањем обиму свог алата него што су то Сејџ програмерили мислили. Они су затим форковали Пирекс као SageX. Када су сазнали да људи преузимају Сејџ само да би добили SageX, и програмери других пакета (укључућуји Стефана Бехнела, који је одржавао XML библиотеку LXML) су такође одржавали форкове Пирекса, SageX се поделио на Сејџ пројекат и уврстио са cython-lxml да постане Cython.[5]

Cython фајлови имају .pyx екстензију. На први поглед, Cython код изгледа идентично као код Пајтона. Али, тамо где Пајтон је динамично написан, у Cython-у, уписивање може бити опционо обезбеђено, омогућавајући унапређене перформансе, дозвољавајући петље да буду конвертоване у C петље када је то могућеl. На пример:

def primes(int kmax): # The argument will be converted to int or raise a TypeError.
    cdef int n, k, i  # These variables are declared with C types.
    cdef int p[1000]  # Another C type
    result = []  # A Python type
    if kmax > 1000:
        kmax = 1000
    k = 0
    n = 2
    while k < kmax:
        i = 0
        while i < k and n % p[i] != 0:
            i = i   1
        if i == k:
            p[k] = n
            k = k   1
            result.append(n)
        n = n   1
    return result

Статични типови декларација и Перформансе

[уреди | уреди извор]

Cython програм који имплементира исти алгоритам као и одговарајући Пајтон програм може трошити мање рачинарских ресураса као што су меморија и циклуси процесовања због разлика између CPython-а и Cython модела извршења. У једну руку, основни Пајтон програм је учитан и извршен од стране CPython виртуалне машине, тако да и време покретања као и сам програм троше ресурсе. У другу руку, Cython програм је компајлован у коду C-а, који је даље компајлован у машински код, тако да виртуелна машина се само користи привремено када се програм учитава.[6][7][8][9]

Cython садржи:

  • Оптимистичне оптимизације
  • Интерфејс уноса (опционо)
  • Ниски општи трошкови у контроли структура
  • Ниски општи трошкови у звању функција[10][11]

Пошто је 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.

Референце

[уреди | уреди извор]
  1. ^ „Cython - an overview — Cython 0.19.1 documentation”. Docs.cython.org. Приступљено 21. 7. 2013. 
  2. ^ Smith, Kurt (2015). Cython: A Guide for Python Programmers. O'Reilly Media. ISBN 978-1-4919-0155-7. 
  3. ^ „Differences between Cython and Pyrex”. Архивирано из оригинала 25. 07. 2011. г. Приступљено 29. 10. 2015. 
  4. ^ Ewing, Greg (21. 3. 2011). „Re: VM and Language summit info for those not at Pycon (and those that are!)” (Message to the electronic mailing-list python-dev). Приступљено 5. 5. 2011. 
  5. ^ 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. 
  6. ^ Oliphant, Travis (20. 6. 2011). „Technical Discovery: Speeding up Python (NumPy, Cython, and Weave)”. Technicaldiscovery.blogspot.com. Приступљено 21. 7. 2013. 
  7. ^ 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. 
  8. ^ а б 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. 
  9. ^ Wilbers, I.; Langtangen, H. P.; Ødegård, Å. (2009). B. Skallerud; H. I. Andersson, ур. „Using Cython to Speed up Numerical Python Programs”. Proceedings of MekIT'09: 495—512. Архивирано из оригинала (PDF) 04. 01. 2017. г. Приступљено 14. 6. 2011. 
  10. ^ „wrapper benchmarks for several Python wrapper generators (except Cython)”. Архивирано из оригинала 04. 04. 2015. г. Приступљено 29. 10. 2015. 
  11. ^ „wrapper benchmarks for Cython, Boost.Python and PyBindGen”. 
  12. ^ „inSCIght: The Scientific Computing Podcast” (Episode 6). Архивирано из оригинала 10. 10. 2014. г. Приступљено 29. 10. 2015. 
  13. ^ 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. 
  14. ^ Who also criticizes Cython (21. 3. 2011). „Re: VM and Language summit info for those not at Pycon (and those that are!)” (Message to the electronic mailing-list python-dev). Приступљено 5. 5. 2011. 
  15. ^ Erocal, Burcin; Stein, William (2010). „The Sage Project: Unifying Free Mathematical Software to Create a Viable Alternative to Magma, Maple, Mathematica and MATLAB” (PDF). Mathematical Software‚ ICMS 2010. Springer Berlin / Heidelberg. 6327: 12—27. doi:10.1007/978-3-642-15582-6_4. 
  16. ^ „SciPy 0.7.2 release notes”. Архивирано из оригинала 04. 03. 2016. г. Приступљено 29. 10. 2015. 
  17. ^ Pedregosa, Fabian; Varoquaux, Gaël; Gramfort, Alexandre; Michel, Vincent; Thirion, Bertrand; Grisel, Olivier; Blondel, Mathieu; Prettenhofer, Peter; Weiss, Ron; Dubourg, Vincent; Vanderplas, Jake; Passos, Alexandre; Cournapeau, David (2011). „Scikit-learn: Machine Learning in Python”. Journal of Machine Learning Research. 12: 2825—2830. 
  18. ^ „Is Quora still running on PyPy?”. 
  19. ^ „Python”. 

Литература

[уреди | уреди извор]