Cython - Cython

Cython
Cython-logo.svg
Fejlesztő Robert Bradshaw, Stefan Behnel és mtsai.
Először jelent meg 2007. július 28 . ; 14 évvel ezelőtt ( 2007-07-28 )
Stabil kiadás 0.29.21 (2020. július 8 .; 14 hónapja ) [±] ( 2020-07-08 )
Előzetes verzió 3.0a6 (2020. július 31 .; 13 hónapja ) [±] ( 2020-07-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 .org Szerkessze ezt a Wikidatában
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

Image
Hello World in Cython

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 a setuptoolsfordí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.

Lásd még

Hivatkozások

Külső linkek