Cython — разлика између измена

С Википедије, слободне енциклопедије
Садржај обрисан Садржај додат
Направљено превођењем странице „Cython
(нема разлике)

Верзија на датум 29. октобар 2015. у 21:48

Програмски језик Cython је суперсет Пајтона са интерфејсом стране функције за позивање  C/C++ рутина и способношћу да декларише статични тип субрутинских параметара и резултата, локалних променљивих, и својства класа.[1][2]

Преглед

Cython је компајлован језик који генерише модуле екстензија CPython-а. Ови модули екстензија онда могу бити учитани и коришћени од стране регуларног Пајтон кода коришћењем import наредби. Cython је написан у Пајтону и ради на системима Виндоус, Линукс, и 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.

Такође погледати

  • PyPy

Литература

  1. ^ „Cython - an overview — Cython 0.19.1 documentation”. Docs.cython.org. Приступљено 2013-07-21. 
  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”. 
  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 (2011-06-20). „Technical Discovery: Speeding up Python (NumPy, Cython, and Weave)”. Technicaldiscovery.blogspot.com. Приступљено 2013-07-21. 
  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 8 th Python in Science Conference (SciPy 2009): 15—22.  line feed character у |journal= на позицији 21 (помоћ)
  9. ^ Wilbers, I.; Langtangen, H. P.; Ødegård, Å. (2009). B. Skallerud; H. I. Andersson, ур. „Using Cython to Speed up Numerical Python Programs” (PDF). Proceedings of MekIT'09: 495—512. Приступљено 14. 6. 2011. 
  10. ^ „wrapper benchmarks for several Python wrapper generators (except Cython)”. 
  11. ^ „wrapper benchmarks for Cython, Boost.Python and PyBindGen”. 
  12. ^ „inSCIght: The Scientific Computing Podcast” (Episode 6). 
  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”. 
  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. ^ „http://www.zeromq.org/bindings:python”.  Спољашња веза у |title= (помоћ)