Cython
| Cython | |
|---|---|
|
| |
| Grundlæggende data | |
| Paradigmer : | multi-paradigmatisk |
| Udgivelsesår: | 28. juli 2007 |
| Udvikler: | Robert Bradshaw, Stefan Behnel, et al. |
| Aktuel version | 0.29.21 (8. juli 2020) |
| Indtastning : | stærk , statisk , dynamisk (" duck typing ") |
| Påvirket af: | Python , C , C ++ |
| Operativsystem : | Linux , unix-lignende system |
| Licens : | Apache-licens, version 2.0, Apache-licens |
| cython.org | |
Cython er et universelt programmeringssprog , der stort set er kompatibelt med Python . Som disse understøtter den forskellige programmeringsparadigmer som objektorienteret , aspektorienteret og funktionel programmering. Den største fordel ligger dog i oversættelsen til målsproget C, som muliggør både høj ydeevne sammenlignet med standard Python-tolk og direkte interaktion med ekstern kode skrevet i C, C ++ eller Fortran .
De vigtigste applikationer er forbindelsen af eksterne biblioteker til CPython - tolken samt accelerationen af Python - koden. Cython- compileren kan også bruges til at kompilere rene Python-moduler.
Den genererede kode er ikke selvforsynende, men kræver et CPython-kompatibelt runtime-miljø . Både genereringen af binære moduler ("udvidelsesmodul"), som dynamisk kan importindlæses i Python-tolken ved hjælp af kommandoen, og linkerintegrationen af CPython-tolken i det genererede modul, så en eksekverbar Programmet oprettes ( indlejring ).
Udviklingshistorie
Cython er baseret på Pyrex af Greg Ewing (først offentliggjort 4. april 2002). I juli 2007 blev Cython-compileren opdelt fra Pyrex af Robert Bradshaw og Stefan Behnel som et uafhængigt, åbent udviklet projekt. Siden da er der gjort forsøg på at holde de to kompilatorer stort set kompatible, selvom Cython bruger meget mere omfattende optimeringer og opnår større kompatibilitet med Python-kode. Vigtige forskelle i forhold til Pyrex er beskrevet i Cython-dokumentationen.
Navnets oprindelse
Navnet Cython er et kuffertord for de to underliggende programmeringssprog: Python og C.
sigter mod
Cython-projektet har sat sig som mål at udvikle en compiler til normal Python-kode, der tilbyder den højest mulige ydeevne og omfattende integration med kode skrevet i C, C ++ og Fortran gennem yderligere (eksplicit) statisk typing.
Cython er en optimeringscompiler, men ikke i den sædvanlige betydning af en compiler, der genererer binær kode . Snarere tillader oversættelsen til C-kode mange grundlæggende optimeringer og platformjusteringer til en C-compiler. Cython-kompilatoren kan således begrænse sig til optimeringer på højt niveau på AST- niveau.
C-koden, som Cython genererer, er stort set bærbar med hensyn til platforme (processor, C-kompilator og operativsystem) og CPython-versioner. I øjeblikket (version 0.28.5) understøttes CPython version 2.6 og 2.7 samt alle fra 3.3. Testede platforme inkluderer macOS , Windows og frem for alt forskellige Linux-distributioner med 32-bit og 64-bit systemversioner .
egenskaber
Kombinationen af Python og C giver Cython mulighed for at kortlægge en meget bred vifte af krav. Både programmering på højt niveau med Python-datatyper, sprogkonstruktioner og automatisk hukommelsesstyring samt programmering meget tæt på C med C-datatyper, C-funktioner og manuel hukommelsesstyring er mulig. Begge kan kombineres efter ønske, og interaktionen med ren (ukompileret) Python-kode er lige så naturlig som interaktionen med C- eller C ++ -koden, hvilket muliggør en meget finkornet tilgang, når man optimerer Cython-kode. Enhver del af koden kan skrives i ren Python, kompileret med Cython, optimeret med statiske datatyper eller endda porteret til C afhængigt af kravene. På denne måde understøtter Cython princippet om, at det meste af runtime for et program oprettes i en meget lille del af kildekoden , dvs. optimering af en lille del af programmet kan give en meget stor gevinst i ydeevne, mens størstedelen af koden har en høj udviklingshastighed og en lav vedligeholdelse er vigtigere end den højest mulige udførelseshastighed.
Programmeringssproget opnår sprogintegration mellem Python og C primært gennem datatyper. Forskellige Python-sprogkonstruktioner kan anvendes på både Python-datatyper og C-datatyper. Et eksempel er 'for' -sløjfen, som er en foreach-sløjfe i Python, dvs. den kan køre over enhver iterabel beholder (f.eks. Lister eller filer). I Cython kan denne sløjfe også køre over C ++ lister, C arrays og subarrays samt over markør sektioner (skiver, f.eks. ptr[2:8]For forskydning 2–7). Derudover er der en automatisk konvertering mellem forskellige Python-datatyper og C-datatyper, både for skalartyper (tal) og for tegnstrenge og strukturerede datatyper (f.eks. C-strukturtyper og Python-ordbøger).
ydeevne
Mange af de optimeringer, som Cython-compileren udfører, resulterer automatisk i en specialisering af den genererede C-kode. For at gøre dette bruger kompilatoren eksplicitte erklæringer om statisk type og (simpel) type inferens til at generere specialiseret C-kode til de anvendte datatyper og visse kodemønstre. En stor del af optimeringerne i Cython-kompilatoren vedrører sløjfer, da en stor del af den samlede driftstid normalt akkumuleres her.
Kontrolstrukturer (især sløjfer) oversættes mange gange hurtigere med Cython og en C-compiler, end når de fortolkes af CPython. Dette skyldes optimistiske optimeringer og type inferens. Dette betyder, at Cython-kompileret Python-kode normalt kører hurtigere end i CPython 2.6.x, selv uden eksplicitte typedeklarationer, selvom den relative ydeevne naturligvis afhænger af den pågældende kode. Men gennem den statiske erklæring af datatyper og den deraf følgende specialisering af C-koden er det normalt muligt at opnå en multipel acceleration. Især med matematiske beregninger resulterer forbedringer i runtime ofte med en faktor på hundrede til tusind. Til sammenligning er den typiske acceleration gennem Python JIT-kompilatoren Psyco omkring fire til hundrede gange , hvor PyPy i udvalgte tilfælde er op til tolv gange.
Koden genereret af Cython til funktioner er optimeret til hurtig udpakning og konvertering af opkaldsparametre. Derfor er det normalt hurtigere at ringe til Python via en Cython- indpakning hurtigere end i andre indpakningsimplementeringer til Python.
anvendelsesområder
De vigtigste anvendelsesområder for Cython er forbindelsen af eksterne biblioteker til CPython-tolken såvel som accelerationen af Python-koden, især i matematiske beregninger og beregningsintensive algoritmer .
For eksempel er SageMath- computer-algebra-systemet stort set baseret på Cython-kode. Dette bruges til at implementere matematiske algoritmer såvel som til at linke eksterne koder i C, C ++ og Fortran. Cython understøtter også en meget effektiv interaktion med NumPy - matricer , som baseret på disse beregninger er meget forenklet.
Det højtydende XML- bibliotek lxml er stort set implementeret i Cython. De eksterne C-biblioteker libxml2 og libxslt er knyttet til Python-tolken.
Et andet eksempel fra Cython Core-udviklermiljøet er MPI- biblioteket mpi4py. Det forbinder forskellige MPI-implementeringer til CPython.
I Python Package Index er der en kort liste over andre biblioteker, der er implementeret i Cython.
Relaterede og lignende projekter
- Pyrex - forgænger af Cython
- Unladen Swallow - optimeret CPython runtime-miljø; baseret på LLVM
- PyPy - JIT compiler framework og Python runtime, der i sig selv er skrevet i en Python-dialekt (RPython)
- Psyco - specialiseret JIT-kompilator og kodeoptimering til CPython- runtime-miljøet
- Shed Skin - statisk skrevet, Python-lignende programmeringssprog, der er kompileret i henhold til C ++
Individuelle beviser
- ↑ Slip 0.29.21 . 8. juli 2020 (adgang til 9. juli 2020).
- ↑ github.com . (adgang til 2. februar 2020).
- ^ Cython: C-Extensions til Python . (adgang til den 8. juli 2018).
- ↑ originale versioner af forgængeren Pyrex
- ↑ Kompatibilitet med Python 2 er det erklærede mål for fremtiden Cython version 1.0 ( Memento af den originale fra og med august 10, 2011 i den Internet Archive ) Info: Den arkivet link automatisk blev indsat og endnu ikke kontrolleret. Kontroller original- og arkivlinket i henhold til instruktionerne, og fjern derefter denne meddelelse.
- ↑ skiver på docs.python.org, åbnet 2. august 2018
- ↑ gmane.comp.python.cython.devel - pybench-sammenligning af Cython og CPython 2.6.2
- ↑ gmane.comp.python.cython.devel - Passing en pointer fra Python ( Memento af den originale fra 14 februar 2017 i Internet Archive ) Info: Den arkiv link blev indsat automatisk, og er endnu ikke blevet kontrolleret. Kontroller original- og arkivlinket i henhold til instruktionerne, og fjern derefter denne meddelelse.
- ^ Psyco - Introduktion
- ↑ Hastighed på PyPy 1.4 sammenlignet med CPython 2.6.2 med / uden Psyco
- ↑ C ++ wrapper benchmarks for forskellige Python wrapper generatorer (uden Cython) ( Memento af den originale fra april 4, 2015 af Internet Archive ) Info: Den arkivet link automatisk blev indsat og endnu ikke kontrolleret. Kontroller original- og arkivlinket i henhold til instruktionerne, og fjern derefter denne meddelelse.
- ↑ C ++ wrapper benchmarks for Cython, Boost.Python og PyBindGen
- ↑ Liste over Python-pakker implementeret i Cython på PyPI