Cython - Cython
| Udvikler | Robert Bradshaw, Stefan Behnel, et al. |
|---|---|
| Første gang dukkede op | 28. juli 2007 |
| Stabil udgivelse | 0.29.21 (8. juli 2020 ) [±] |
| Udgivelsesversion | 3.0a6 (31. juli 2020 ) [±] |
| Implementeringssprog | Python |
| OS | Windows , MacOS , Linux |
| Licens | Apache -licens 2.0 |
| Filnavn udvidelser | .pyx, .pxd, .pxi |
| Internet side |
cython |
| Påvirket af | |
| C , Python | |
Cython er et programmeringssprog, der har til formål at være et supersæt af Python -programmeringssproget , designet til at give C -lignende ydeevne med kode, der for det meste er skrevet i Python med valgfri ekstra C -inspireret syntaks.
Cython er et kompileret sprog , der typisk bruges til at generere CPython -udvidelsesmoduler. Annoteret Python-lignende kode kompileres til C eller C ++ og indpakkes derefter automatisk i grænsefladekode , der producerer udvidelsesmoduler, der kan indlæses og bruges af almindelig Python-kode ved hjælp af importudtalelsen, men med betydeligt mindre beregningsomkostninger ved løbetid . Cython letter også indpakning af uafhængig C- eller C ++-kode i moduler, der kan importeres fra python.
Cython er skrevet i Python og C og fungerer på Windows , macOS og Linux og producerer kildefiler, der er kompatible med CPython 2.6, 2.7 og 3.3 og senere versioner.
Cython 3.0.0 er under udvikling.
Design
Cython fungerer ved at producere et standard Python -modul. Adfærden adskiller sig imidlertid fra standard Python ved, at modulkoden, der oprindeligt blev skrevet i Python, oversættes til C. Mens den resulterende kode er hurtig, foretager den mange opkald til CPython -tolken og CPython -standardbibliotekerne for at udføre egentligt arbejde. At vælge dette arrangement sparede betydeligt på Cythons udviklingstid, men moduler er afhængige af Python -tolken og standardbiblioteket.
Selvom det meste af koden er C-baseret, kræves der normalt en lille stubbelæsser, der er skrevet i fortolket Python (medmindre målet er at oprette en loader helt skrevet i C, hvilket kan indebære arbejde med de udokumenterede internaler i CPython). Dette er imidlertid ikke et stort problem på grund af tilstedeværelsen af Python -tolken.
Cython har en udenlandsk funktionsgrænseflade til påkaldelse af C / C ++ - rutiner og evnen til at deklarere den statiske type underrutineparametre og resultater, lokale variabler og klasseattributter.
Et Cython -program, der implementerer den samme algoritme som et tilsvarende Python -program, kan forbruge færre computerressourcer, såsom kernehukommelse og behandlingscyklusser på grund af forskelle mellem CPython- og Cython -eksekveringsmodellerne. Et grundlæggende Python -program indlæses og eksekveres af den virtuelle CPython -maskine , så både runtime og selve programmet bruger computerressourcer. Et Cython -program kompileres til C -kode, som yderligere kompileres til maskinkode, så den virtuelle maskine bruges kun kortvarigt, når programmet er indlæst.
Cython anvender:
- Optimistiske optimeringer
- Type inferens (valgfri)
- Lav overhead i kontrolstrukturer
- Lav funktion opkald overhead
Ydeevnen afhænger både af, hvilken C -kode der genereres af Cython, og hvordan denne kode kompileres af C -kompilatoren.
Historie
Cython er en afledning af Pyrex -sproget og understøtter flere funktioner og optimeringer end Pyrex. Cython blev forked fra Pyrex i 2007 af udviklere af Sage computer algebra -pakken, fordi de var utilfredse med Pyrex's begrænsninger og ikke kunne få patches accepteret af Pyrex's vedligeholder Greg Ewing, der forestillede sig et meget mindre omfang for sit værktøj, end Sage -udviklerne havde i sind. De gafflede derefter Pyrex som SageX. Da de fandt ud af, at folk downloadede Sage bare for at få SageX, og udviklere af andre pakker (herunder Stefan Behnel, der vedligeholder XML -biblioteket LXML) vedligeholdt også gafler af Pyrex, blev SageX adskilt fra Sage -projektet og fusioneret med for cython-lxmlat blive Cython.
Cython -filer har en .pyxudvidelse. På sin mest grundlæggende ligner Cython -kode nøjagtigt Python -kode. Mens standard Python er dynamisk indtastet , kan der dog i Cython leveres typer, hvilket muliggør forbedret ydeevne, så sløjfer kan konverteres til C -sløjfer, hvor det er muligt. For eksempel:
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
Eksempel
Et eksempel på et hej -verdensprogram til Cython er mere komplekst end på de fleste sprog, fordi det har grænseflader med Python C API og setuptoolsudvidelsesbygningsfaciliteten. Der kræves mindst tre filer til et grundlæggende projekt:
- En
setup.pyfil til at påberåbe sigsetuptoolsbyggeprocessen, der genererer udvidelsesmodulet - Et hovedpythonprogram til at indlæse udvidelsesmodulet
- Cython -kildefil (er)
Følgende kodelister demonstrerer bygge- og lanceringsprocessen:
# 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"))
Disse kommandoer bygger og starter programmet:
$ python setup.py build_ext --inplace
$ python launch.py
Brug i IPython/Jupyter notebook
En mere ligetil måde at starte med Cython er via kommandolinjens IPython (eller via en pythonkonsol i browseren kaldet 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
hvilket giver en forbedring på 95 gange i forhold til ren-python-versionen. Flere detaljer om emnet på den officielle quickstart -side.
Anvendelser
Cython er især populær blandt videnskabelige brugere af Python, hvor det har "det perfekte publikum" ifølge Python -skaberen Guido van Rossum . Af særlig opmærksomhed:
- Den gratis software SageMath computer algebra system afhænger af Cython, både for ydeevne og til grænseflade med andre biblioteker.
- Betydelige dele af de videnskabelige databiblioteker SciPy , pandaer og scikit-learn er skrevet i Cython.
- Nogle websteder med høj trafik, såsom Quora, bruger Cython.
Cythons domæne er ikke begrænset til bare numerisk computing. For eksempel er lxml XML -værktøjssættet for det meste skrevet i Cython, og ligesom forgængeren Pyrex bruges Cython til at levere Python -bindinger til mange C- og C ++ - biblioteker, f.eks. Messaging -biblioteket ZeroMQ . Cython kan også bruges til at udvikle parallelle programmer til multi-core processor maskiner; denne funktion gør brug af OpenMP -biblioteket.