Cython

Cython
Cython-logo.svg
Grundläggande information
Paradigmer : multiparadigmatisk
Publiceringsår: 28 juli 2007
Utvecklaren: Robert Bradshaw, Stefan Behnel, et al.
Aktuell  version 0.29.21   (8 juli 2020)
Skriva : stark , statisk , dynamisk (" duck typing ")
Påverkad av: Python , C , C ++
Operativsystem : Linux , unixliknande system
Licens : Apache-licens, version 2.0, Apache-licens
cython.org

Cython är ett universellt programmeringsspråk som till stor del är kompatibelt med Python . Som dessa stöder den olika programmeringsparadigmer som objektorienterad , aspektorienterad och funktionell programmering. Den största fördelen ligger dock i översättningen till målspråket C, vilket möjliggör både hög prestanda jämfört med standard Python-tolk och direkt interaktion med extern kod skriven i C, C ++ eller Fortran .

De huvudsakliga användningsområdena är anslutningen av externa bibliotek till CPython - tolk , samt acceleration av Python-kod. Cython- kompilatorn kan också användas för att kompilera rena Python-moduler.

Den genererade koden är inte självförsörjande, men kräver en CPython-kompatibel runtime-miljö . Både genereringen av binära moduler ("förlängningsmodul"), som kan laddas dynamiskt importi Python-tolk med kommandot, och länkintegrering av CPython-tolk i den genererade modulen, så att ett körbart program skapas ( inbäddning ).

Utvecklingshistoria

Cython är baserad på Pyrex av Greg Ewing (publicerades först 4 april 2002). I juli 2007 delades Cython-kompilatorn från Pyrex som ett oberoende, öppet utvecklat projekt av Robert Bradshaw och Stefan Behnel. Sedan dess har försök gjorts för att hålla de två kompilatorerna i stort sett kompatibla, även om Cython använder mycket mer omfattande optimeringar och uppnår större kompatibilitet med Python-kod. Viktiga skillnader mot Pyrex beskrivs i Cython-dokumentationen.

Namnets ursprung

Namnet Cython är ett resväskaord för de två underliggande programmeringsspråken: Python och C.

syftar till

Cython-projektet har satt sig som mål att utveckla en kompilator för normal Python-kod som erbjuder högsta möjliga prestanda och omfattande integration med kod skriven i C, C ++ och Fortran genom ytterligare (uttrycklig) statisk skrivning.

Cython är en optimerande kompilator, men inte i den vanliga betydelsen av en kompilator som genererar binär kod . Snarare tillåter översättningen till C-kod många grundläggande optimeringar och plattformsjusteringar att lämnas till en C-kompilator. Cython-kompilatorn kan således begränsa sig till högnivåoptimeringar på AST- nivå.

C-koden som Cython genererar är till stor del bärbar när det gäller plattformar (processor, C-kompilator och operativsystem) och CPython-versioner. För närvarande (version 0.28.5) stöds CPython-versionerna 2.6 och 2.7 samt alla från 3.3 på. Testade plattformar inkluderar macOS , Windows och framför allt olika Linux-distributioner med 32-bitars och 64-bitars systemversioner .

egenskaper

Kombinationen av Python och C gör att Cython kan kartlägga ett stort antal krav. Både högnivåprogrammering med Python-datatyper, språkkonstruktioner och automatisk minneshantering samt programmering mycket nära C med C-datatyper, C-funktioner och manuell minneshantering är möjlig. Båda kan kombineras efter önskemål och interaktionen med ren (okompilerad) Python-kod är lika naturlig som interaktionen med C- eller C ++ -koden, vilket möjliggör en mycket finkornig metod när man optimerar Cython-koden. Varje del av koden kan skrivas i ren Python, sammanställas med Cython, optimeras med statiska datatyper eller till och med överförs till C, beroende på kraven. På detta sätt stöder Cython principen att det mesta av körningstiden för ett program skapas i en mycket liten del av källkoden , dvs optimeringen av en liten del av programmet kan ge en mycket stor prestationsförstärkning, medan för majoriteten av koden är en hög utvecklingshastighet och ett lågt underhållskrav viktigare än högsta möjliga körhastighet.

Programmeringsspråket uppnår språkintegration mellan Python och C främst genom datatyper. Olika Python-språkkonstruktioner kan tillämpas på både Python-datatyper och C-datatyper. Ett exempel är 'for' -slingan, som är en förslinga i Python, dvs den kan köras över vilken iterabel behållare som helst (t.ex. listor eller filer). I Cython kan den här slingan också köras över C ++ - listor, C-matriser och undermatriser, liksom över pekarsektioner (skivor, t.ex. ptr[2:8]för förskjutningar 2–7). Dessutom sker en automatisk konvertering mellan olika Python-datatyper och C-datatyper, både för skalartyper (siffror) och för teckensträngar och strukturerade datatyper (t.ex. C-strukturtyper och Python-ordböcker).

prestanda

Många av de optimeringar som Cython-kompilatorn utför resulterar automatiskt i en specialisering av den genererade C-koden. För att göra detta använder kompilatorn tydliga statiska typdeklarationer och (enkel) typslutledning för att generera specialiserad C-kod för de datatyper som används och vissa kodmönster. En stor del av optimeringarna i Cython-kompilatorn avser loopar, eftersom en stor del av den totala körtiden vanligtvis ackumuleras här.

Kontrollstrukturer (särskilt slingor) översätts många gånger snabbare med Cython och en C-kompilator än när de tolkas av CPython. Detta beror på optimistiska optimeringar och typslutledning. Detta innebär att Cython-kompilerad Python-kod vanligtvis går snabbare än i CPython 2.6.x även utan uttryckliga typdeklarationer, även om den relativa prestandan naturligtvis beror på koden i fråga. Men genom den statiska deklarationen av datatyper och den resulterande specialiseringen av C-koden är det vanligtvis möjligt att uppnå en multipelacceleration. Speciellt med matematiska beräkningar resulterar förbättringar i körning ofta av en faktor på hundra till tusen. I jämförelse är den typiska accelerationen av Python JIT-kompilatorn Psyco cirka fyra till hundra gånger , med PyPy i utvalda fall upp till tolv gånger.

Koden som genereras av Cython för funktioner är optimerad för snabb uppackning och konvertering av samtalsparametrar. Därför är det vanligtvis snabbare att ringa inbyggd kod till Python via ett Cython- omslag än i andra omslagsimplementeringar för Python.

applikationsområden

De viktigaste användningsområdena för Cython är anslutningen av externa bibliotek till CPython-tolk, liksom accelerationen av Python-kod, särskilt i matematiska beräkningar och beräkningsintensiva algoritmer .

Till exempel är SageMaths datoralgebrasystem till stor del baserat på Cython-kod. Detta används för att implementera matematiska algoritmer samt för att länka externa koder i C, C ++ och Fortran. Cython stöder också en mycket effektiv interaktion med numpy - matriser , som grundar sig på dessa beräkningar kraftigt förenklade.

Det högpresterande XML- biblioteket lxml implementeras till stor del i Cython. De externa C-biblioteken libxml2 och libxslt är länkade till Python-tolk.

Ett annat exempel från Cython Core-utvecklarmiljön är MPI- biblioteket mpi4py. Den ansluter olika MPI-implementeringar till CPython.

Python Package Index innehåller en kort lista över andra bibliotek som implementeras i Cython.

Relaterade och liknande projekt

  • Pyrex - föregångare till Cython
  • Unladen Swallow - optimerad CPython runtime-miljö; baserat på LLVM
  • PyPy - JIT-kompilatorramverk och Python-körning som själv är skriven i en Python-dialekt (RPython)
  • Psyco - specialiserad JIT-kompilator och kodoptimering för CPython runtime-miljö
  • Shed Skin - statiskt skriven, Python-liknande programmeringsspråk som sammanställs enligt C ++

Individuella bevis

  1. Släpp 0.29.21 . 8 juli 2020 (nås 9 juli 2020).
  2. github.com . (nås den 2 februari 2020).
  3. Cython: C-Extensions för Python . (nås den 8 juli 2018).
  4. originalversioner av föregångaren Pyrex
  5. Kompatibilitet med Python 2 är den deklarerade mål för framtiden Cython version 1.0 ( Memento av den ursprungliga från 10 aug 2011 i Internet Archive ) Info: Den arkiv länk automatiskt in och ännu inte kontrollerats. Kontrollera original- och arkivlänken enligt instruktionerna och ta bort detta meddelande. @ 1@ 2Mall: Webachiv / IABot / wiki.cython.org
  6. skivor på docs.python.org, nås den 2 augusti 2018
  7. gmane.comp.python.cython.devel - pybench-jämförelse av Cython och CPython 2.6.2
  8. gmane.comp.python.cython.devel - Passerar en pekare från Python ( Memento av den ursprungliga från 14 Februari 2017 i Internet Archive ) Info: Den arkiv länk infördes automatiskt och har ännu inte kontrollerats. Kontrollera original- och arkivlänken enligt instruktionerna och ta bort detta meddelande. @ 1@ 2Mall: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Introduktion
  10. PyPy 1.4-hastighet jämfört med CPython 2.6.2 med / utan Psyco
  11. C ++ omslag riktmärken för olika Python wrapper generatorer (utan Cython) ( Memento av den ursprungliga från April 4, 2015 i Internet Archive ) Info: Den arkiv länk automatiskt in och ännu inte kontrollerats. Kontrollera original- och arkivlänken enligt instruktionerna och ta bort detta meddelande. @ 1@ 2Mall: Webachiv / IABot / telecom.inescporto.pt
  12. C ++ omslagsriktmärken för Cython, Boost.Python och PyBindGen
  13. Lista över Python-paketen implementerade i Cython på PyPI