Cython

S Vikipedije, slobodne enciklopedije
Cython
Logo
Originalni nazivengl. Cython
Izgovara seSajton
Modelprogramski jezik
Autor(i)Robert Bredšo, Stefan Behnel
LicencaApache Licenca
Veb-sajthttp://cython.org

Programski jezik Cython je nadskup Pajtona sa interfejsom strane funkcije za pozivanje C/C++ rutina i sposobnošću da deklariše statični tip podrutinskih parametara i rezultata, lokalnih promenljivih, i svojstava klasa.[1][2]

Pregled[uredi | uredi izvor]

Cython je kompajlovan jezik koji generiše module ekstenzija CPython-a. Ovi moduli ekstenzija onda mogu biti učitani i korišćeni od strane običnog Pajton koda korišćenjem import naredbi. Cython je napisan u Pajtonu i radi na sistemima Microsoft Windows, Linuks, i Mac OS X, proizvodeći izvorne fajlove kompatibilne sa CPython 2.4 do 3.4.

Radi tako što proizvodi standardan Pajton modul. Ali, ponašanje se razlikuje od standardnog Pajtona u tom modulu koda, prvobitno napisanog u Pajtonu, je preveden u C. Dok je rezultujući kod brz, on pravi puno poziva u CPython interpretatoru i koristi CPython standardne biblioteke da izvrše sav posao. Ovakav način rada je sačuvao prilično dosta vremena u razvoju Cython-a, ali moduli imaju zavisnost na Pajton interpretator i standardnu biblioteku.

Iako je većina koda zasnovana na C-u, mali deo loudera napisan u interpretatoru Pajtona je obično neophodan (osim ako je cilj da se napravi louder potpuno napisan u jeziku C, što može zahtevati rad sa nedokumentovanim unutrašnjostima CPython-a). Ali, ovo nije glavni problem zbog prisustva intepretatora Pajtona.

Primer programa[uredi | uredi izvor]

Hello World in Cython

Primer hello world programa za Cython je složeniji nego u drugim jezicima jer dolazi u dodir sa Pajton C API i distutils ekstenzijom. Barem tri fajlova je potrebno za osnovni projekat:

  •  setup.py fajl da pozove distutils proces koji generiše modulacionu ekstenziju
  • Glavni pajton program da učita modulacionu ekstenziju
  • Cython izvorne fajlove

Sledeći kod demonstrira proces gradnje i pokretanja:

# 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"))

Ove komande grade i pokreću program:

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

Istorija[uredi | uredi izvor]

Cython je derivat jezika Pireks, i podržava više karakteristika i optimizacija nego Pireks.[3][4]

Cython je forkovan iz Pireksa tokom 2007. od strane programera Sejdž paketa kompjuterske algebre, jer nisu bili zadovoljni Pireksovim ograničenjima i nisu mogli dobijati zakrpe prihvaćene od Pireksovog održavaoca Grega Evinga, koji je imao predstavu o mnogo manjem obimu svog alata nego što su to Sejdž programerili mislili. Oni su zatim forkovali Pireks kao SageX. Kada su saznali da ljudi preuzimaju Sejdž samo da bi dobili SageX, i programeri drugih paketa (uključućuji Stefana Behnela, koji je održavao XML biblioteku LXML) su takođe održavali forkove Pireksa, SageX se podelio na Sejdž projekat i uvrstio sa cython-lxml da postane Cython.[5]

Primer[uredi | uredi izvor]

Cython fajlovi imaju .pyx ekstenziju. Na prvi pogled, Cython kod izgleda identično kao kod Pajtona. Ali, tamo gde Pajton je dinamično napisan, u Cython-u, upisivanje može biti opciono obezbeđeno, omogućavajući unapređene performanse, dozvoljavajući petlje da budu konvertovane u C petlje kada je to mogućel. Na primer:

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

Statični tipovi deklaracija i Performanse[uredi | uredi izvor]

Cython program koji implementira isti algoritam kao i odgovarajući Pajton program može trošiti manje račinarskih resurasa kao što su memorija i ciklusi procesovanja zbog razlika između CPython-a i Cython modela izvršenja. U jednu ruku, osnovni Pajton program je učitan i izvršen od strane CPython virtualne mašine, tako da i vreme pokretanja kao i sam program troše resurse. U drugu ruku, Cython program je kompajlovan u kodu C-a, koji je dalje kompajlovan u mašinski kod, tako da virtuelna mašina se samo koristi privremeno kada se program učitava.[6][7][8][9]

Cython sadrži:

  • Optimistične optimizacije
  • Interfejs unosa (opciono)
  • Niski opšti troškovi u kontroli struktura
  • Niski opšti troškovi u zvanju funkcija[10][11]

Pošto je C osrednji jezik po težini, performanse će zavisiti od C kompajlera.

Korišćenost[uredi | uredi izvor]

Cython je posebno popularan kod naučnih korisnika Pajtona,[8][12][13] gde ima "savršenu publiku" prema rečima Pajton programera Gvido van Rosum.[14] Istaknujući:

  • Besplatan softver Sejdž sistema kompjuterske algebre zavisi od Cython-a, i za performanse i za dodirivanje sa drugim bibliotekama.[15]
  • Veći deo naučno kompjuterskih biblioteka SciPy, pandas i scikit-learn su napisani u Cython-u.[16][17]
  • Neki popularni sajtovi kao što je Quora koriste Cython [18]

Cython-ov domen nije ograničen samo na numeričko izračunavanje. Na primer, lxml XML alatka je napisana najviše u Cython-u, i kao njegov prethodnik Pireks, Cython se koristi da se obezbedi Pajtonu bajnding za mnoge C i C++ biblioteke kao što je biblioteka razmenjeivanja poruka ZeroMQ.[19] Cython takođe može biti korišćen da se napravi paralelna obrada za mašine višejezgarnih procesora; ova karakteristika koristi biblioteku OpenMP.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ „Cython - an overview — Cython 0.19.1 documentation”. Docs.cython.org. Pristupljeno 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”. Arhivirano iz originala 25. 07. 2011. g. Pristupljeno 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). Pristupljeno 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. Pristupljeno 5. 5. 2011. 
  6. ^ Oliphant, Travis (20. 6. 2011). „Technical Discovery: Speeding up Python (NumPy, Cython, and Weave)”. Technicaldiscovery.blogspot.com. Pristupljeno 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. ^ a b Seljebot, Dag Sverre (2009). „Fast numerical computations with Cython”. Proceedings of the 8th Python in Science Conference (SciPy 2009): 15—22. Arhivirano iz originala 19. 07. 2011. g. Pristupljeno 29. 10. 2015. 
  9. ^ Wilbers, I.; Langtangen, H. P.; Ødegård, Å. (2009). B. Skallerud; H. I. Andersson, ur. „Using Cython to Speed up Numerical Python Programs”. Proceedings of MekIT'09: 495—512. Arhivirano iz originala (PDF) 04. 01. 2017. g. Pristupljeno 14. 6. 2011. 
  10. ^ „wrapper benchmarks for several Python wrapper generators (except Cython)”. Arhivirano iz originala 04. 04. 2015. g. Pristupljeno 29. 10. 2015. 
  11. ^ „wrapper benchmarks for Cython, Boost.Python and PyBindGen”. 
  12. ^ „inSCIght: The Scientific Computing Podcast” (Episode 6). Arhivirano iz originala 10. 10. 2014. g. Pristupljeno 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). Pristupljeno 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”. Arhivirano iz originala 04. 03. 2016. g. Pristupljeno 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”. 

Literatura[uredi | uredi izvor]