Cython - Cython
| Fejlesztő | Robert Bradshaw, Stefan Behnel és mtsai. |
|---|---|
| Először jelent meg | 2007. július 28 . |
| Stabil kiadás | 0.29.21 (2020. július 8 ) [±] |
| Előzetes verzió | 3.0a6 (2020. július 31 ) [±] |
| Végrehajtási nyelv | Piton |
| OS | Windows , MacOS , Linux |
| Engedély | Apache licenc 2.0 |
| Fájlnévkiterjesztések | .pyx, .pxd, .pxi |
| Weboldal |
cython |
| Befolyásolta | |
| C , Python | |
A Cython egy olyan programozási nyelv, amelynek célja a Python programozási nyelv szuperszettje lenni , és amelynek célja, hogy C -szerű teljesítményt nyújtson olyan kóddal, amelyet többnyire Pythonban írnak, opcionális további C -ihlette szintaxissal.
Cython egy összeállított nyelvet használják jellemzően generálni cpython modulokkal. A jegyzetekkel ellátott Python-szerű kód C vagy C ++ nyelvre kerül lefordításra, majd automatikusan interfészkódba csomagolva, bővítőmodulokat állít elő, amelyeket a szokásos Python-kód betölthet és használhat az import utasítás használatával, de lényegesen kevesebb számítási költséggel jár futás közben . A Cython megkönnyíti a független C vagy C ++ kódok csomagolását python importálható modulokba.
A Cython Python és C nyelven íródott, és Windows , macOS és Linux rendszereken működik , és olyan forrásfájlokat állít elő, amelyek kompatibilisek a CPython 2.6, 2.7 és 3.3 és újabb verzióival.
A Cython 3.0.0 fejlesztés alatt áll.
Tervezés
A Cython szabványos Python modul előállításával működik. A viselkedés azonban abban különbözik a szabványos Python -tól, hogy az eredetileg Python -ban írt modulkódot lefordítják C -re. Míg a kapott kód gyors, sok hívást kezdeményez a CPython -tolmács és a CPython szabványos könyvtárakba a tényleges munka elvégzése érdekében. Ennek az elrendezésnek a kiválasztása jelentősen megtakarította a Cython fejlesztési idejét, de a modulok függnek a Python tolmácsától és a szabványos könyvtáratól.
Bár a kód nagy része C-alapú, általában szükség van egy kis csonttöltőre, amely értelmezett Python-ban van írva (kivéve, ha a cél egy teljesen C-ben írt betöltő létrehozása, amely magában foglalhatja a CPython dokumentálatlan belső részeivel való munkát). Ez azonban nem jelent komoly problémát a Python tolmács jelenléte miatt.
A Cython idegen függvényfelülettel rendelkezik a C / C ++ rutinok meghívásához, és képes deklarálni a szubrutin paraméterek és eredmények, a helyi változók és az osztályattribútumok statikus típusát .
Az a Cython -program, amely ugyanazt az algoritmust hajtja végre, mint a megfelelő Python -program, kevesebb számítási erőforrást fogyaszthat, mint például az alapvető memória és a feldolgozási ciklusok, a CPython és a Cython végrehajtási modellek közötti különbségek miatt. Egy alapvető Python programot a CPython virtuális gép tölt be és hajt végre , így mind a futásidő, mind maga a program számítási erőforrásokat emészt fel. Egy Cython programot C kódba fordítanak, amelyet tovább gépi kódba fordítanak, így a virtuális gépet csak rövid ideig használják a program betöltésekor.
A Cython a következőket alkalmazza:
- Optimista optimalizálás
- Típuskövetkeztetés (opcionális)
- Alacsony rezsi a vezérlőszerkezetekben
- Alacsony funkciójú hívás rezsi
A teljesítmény attól függ, hogy a Cython milyen C -kódot generál, és hogyan fordítja össze a kódot a C -fordító.
Történelem
A Cython a Pyrex nyelv származéka , és több funkciót és optimalizációt támogat, mint a Pyrex. Cython volt villás származó Pyrex 2007-ben a fejlesztők a Sage komputeralgebrai csomagot, mert elégedetlen volt a Pyrex korlátai és nem tudott tapaszok által elfogadott Pyrex karbantartója Greg Ewing, aki megálmodta sokkal kisebb teret az eszköz, mint a Sage fejlesztők már a ész. Ezután a Pyrexet SageX -ként elágazták. Amikor rájöttek, hogy az emberek csak azért töltötték le a Sage -t, hogy beszerezzék a SageX -et, és más csomagok fejlesztői (köztük Stefan Behnel, aki az XML -könyvtárat karbantartja ) szintén karbantartották a Pyrex villáit, a SageX -et leváltották a Sage -projektről, és egyesültek, cython-lxmlhogy Cython legyen.
A Cython fájlok .pyxkiterjesztéssel rendelkeznek. A legalapvetőbb Cython -kód pontosan úgy néz ki, mint a Python -kód. Mindazonáltal, míg a szabványos Python -t dinamikusan gépelik, a Cython -ban opcionálisan típusok is rendelkezésre állnak, amelyek lehetővé teszik a jobb teljesítményt, lehetővé téve a hurkok C -hurokká alakítását, ahol ez lehetséges. Például:
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
Példa
A Cython számára készült minta hello world program bonyolultabb, mint a legtöbb nyelv, mivel kapcsolódik a Python C API -hoz és a setuptoolskiterjesztésépítési létesítményhez. Egy alapprojekthez legalább három fájl szükséges:
- A
setup.pyfájl hivatkozhat asetuptoolsfordítási folyamat, amely létrehozza a bővítő modul - Egy fő python program a bővítőmodul betöltéséhez
- Cython forrásfájl (ok)
A következő kódlista bemutatja az összeállítás és az indítás folyamatát:
# 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 setuptools import setup
from Cython.Build import cythonize
setup(name = "Hello world app",
ext_modules = cythonize("*.pyx"))
Ezek a parancsok hozzák létre és indítják el a programot:
$ python setup.py build_ext --inplace
$ python launch.py
Használat IPython/Jupyter notebookban
Egy egyszerű módja annak, hogy kezdeni Cython keresztül parancssoros IPython (vagy a böngésző python konzol nevű Jupyter notebook ):
In [1]: %load_ext Cython
In [2]: %%cython
...: def f(n):
...: a = 0
...: for i in range(n):
...: a += i
...: return a
...:
...: cpdef g(int n):
...: cdef long a = 0
...: cdef int i
...: for i in range(n):
...: a += i
...: return a
...:
In [3]: %timeit f(1000000)
10 loops, best of 3: 26.5 ms per loop
In [4]: %timeit g(1000000)
1000 loops, best of 3: 279 µs per loop
ami 95-szörös javulást jelent a pure-python verzióhoz képest. További részletek a témában a hivatalos gyorsindító oldalon.
Felhasználások
A Cython különösen népszerű a Python tudományos felhasználói között, ahol Guido van Rossum, a Python alkotója szerint "tökéletes közönsége" van . Különös figyelmet érdemel:
- Az ingyenes szoftver, a SageMath számítógépes algebra rendszere a Cythontól függ, mind a teljesítmény, mind a más könyvtárakkal való interfész tekintetében.
- Jelentős része a tudományos számítási könyvtárak SciPy , pandák és scikit elsajátítható vannak írva Cython.
- Néhány nagy forgalmú webhely, például a Quora, a Cython-t használja.
A Cython domainje nem korlátozódik a numerikus számítástechnikára. Például az lxml XML eszköztár többnyire Cython nyelven íródott, és elődjéhez, a Pyrexhez hasonlóan a Cython is Python -kötéseket biztosít számos C és C ++ könyvtárhoz, például a ZeroMQ üzenetkönyvtárhoz . Cython is fel lehet használni, hogy dolgozzon párhuzamos programok számára többmagos processzor gépek; ez a funkció az OpenMP könyvtárat használja.