Cython | |
---|---|
Språkklass | öppen källkod , implementering av programmeringsspråk [d] , Transpiler , programmeringsspråk , fri programvara och Python-bibliotek [d] |
Framträdde i | 28 juli 2007 |
Författare | Robert Bradshaw, Stefan Behnel med flera |
Släpp | 0.29.32 ( 29 juli 2022 ) [1] |
Testversion | 3.0.0a11 ( 31 juli 2022 ) [2] |
Blivit påverkad | Pyrex |
Licens | Apache-licens |
Hemsida | cython.org |
OS | Linux och Unix-liknande operativsystem |
Cython är ett programmeringsspråk som gör det enkelt att skriva C / C++- kodmoduler för Python . Utöver den vanliga Python-syntaxen stöds följande:
Cython-kod konverteras till C/C++-kod för kompilering och kan senare användas som en tillägg till standard Python eller som en fristående applikation med inbyggt Cython runtime-bibliotek.
Cython är efterföljaren till programmeringsspråket Pyrex , men har fler funktioner och optimeringar. [3]
Cython har en mycket nära syntax till Python.
En speciell fördel med detta "sömlösa" tillvägagångssätt för Python/C-blandning är att befintlig Python-kod kan ställas in för att köras nästan lika snabbt som att bara lägga till några statiska typdeklarationer och några anpassningar i kritiska slingor, utan behov av komplex gränssnittskod . Kodningshastighet och kodläsbarhet förblir jämförbara med Python.
På grund av den minskade omkostnaden i kontrollstrukturer (särskilt i slingor), optimistiska optimeringar och (begränsad) typinferens , körs Cython-kompilerad Python-kod generellt snabbare än i CPython 2.6.x, även om den absoluta förbättringen är starkt beroende av koden. Med typdeklarationer är typiska hastigheter för numeriska beräkningar/matriser runt 100-1000 gånger. [4] I jämförelse är en typisk hastighetsökning med Psyco ( en JIT- kompilator för Python) cirka 4-100 gånger. [5]
Cython har optimerats för låga subrutinsamtal, så att anropa extern C/C++-kod från Python via Cython-skalet är i allmänhet snabbare än de flesta andra lösningar. [6] [7]
Följande exempel beräknar Ackermann-funktionen :
# Fil ackermann.pyx cdef ackermann ( int m , int n ): if m == 0 : return n + 1 elif n == 0 : return ackermann ( m - 1 , 1 ) else : return ackermann ( m - 1 , ackermann ) ( m , n - 1 )) print ( "Ackermann:" ) print ( ackermann ( 0 , 3 )) print ( ackermann ( 1 , 4 ))För att få en körbar fil måste den översättas till C (här och nedan - skalkommandon för ett UNIX-liknande system ) [8] :
cython --embed ackermann.pyx -o ackermann.cEfter det kan du kompilera den resulterande mellanfilen [8] :
gcc -g -O2 -o ackermann ackermann.c ` python-config --includes --ldflags `För att binda C-bibliotek kan SWIG användas , som stöder flera programmeringsspråk på en gång, men på grund av dess allmänna karaktär förlorar Cython något i användarvänligheten (mängden extra kod som krävs). Andra anmärkningsvärda motsvarigheter inkluderar Parakeet (använder LLVM och JIT-kompilering av speciellt märkt Python-kod) [9] och Nuitka (en Python till C++ översättare som, liksom PyPy , försöker skriva ett Python-program vid kompilering) [10] [8] .
Pytonorm | |
---|---|
gemenskap | |
Genomföranden | |
Övrig |
|