Python-programma converteren naar C/C++-code?

is het mogelijk om een Python-programma naar C/C++ te converteren?

Ik moet een aantal algoritmen implementeren en ik weet niet zeker of de prestatiekloof groot genoeg is om alle pijn te rechtvaardigen die ik zou moeten doorstaan als ik het in C/C++ zou doen (waar ik niet goed in ben) ). Ik dacht erover om één eenvoudig algoritme te schrijven en het te vergelijken met zo’n geconverteerde oplossing. Als dat alleen al aanzienlijk sneller is dan de Python-versie, dan heb ik geen andere keuze dan het in C/C++ te doen.


Antwoord 1, autoriteit 100%

Ja. Kijk naar Cython. Het doet precies dat: Converteert Python naar C voor versnellingen.


Antwoord 2, autoriteit 98%

Als de C-variant x uur minder nodig heeft, dan zou ik die tijd investeren om de algoritmen langer/opnieuw te laten werken

“investeren” is hier niet het juiste woord.

  1. Bouw een werkende implementatie in Python. Je bent hiermee klaar lang voordat je een C-versie zou hebben.

  2. Meet de prestaties met de Python-profiler. Los eventuele problemen op. Wijzig datastructuren en algoritmen waar nodig om dit echt goed te doen. Je bent hiermee klaar lang voordat je de eerste versie in C hebt voltooid.

  3. Als het nog steeds te traag is, vertaal dan handmatig de goed ontworpen en zorgvuldig geconstrueerde Python in C.

    Vanwege de manier waarop achteraf gezien werkt, zal het doen van de tweede versie van bestaande Python (met bestaande unit-tests en met bestaande profileringsgegevens) nog steeds sneller zijn dan proberen om de C-code helemaal opnieuw te doen.

Dit citaat is belangrijk.

Thompsons regel voor makers van nieuwe telescopen
Het is sneller om een spiegel van vier inch te maken en vervolgens een spiegel van zes inch dan om een spiegel van zes inch te maken.

Bill McKeenan
Wang Instituut


Antwoord 3, autoriteit 24%

Shed Skinis “een (beperkte) Python-to-C++ compiler”.


Antwoord 4, autoriteit 16%

Ik kwam zojuist dezenieuwe tool tegen in het hackernieuws.

Van hun pagina – “Nuitka is een goede vervanging voor de Python-interpreter en compileert elke constructie die CPython 2.6, 2.7, 3.2 en 3.3 biedt. Het vertaalt de Python in een C++-programma dat vervolgens “libpython” gebruikt om uit te voeren in de op dezelfde manier als CPython, op een zeer compatibele manier.”


Antwoord 5, autoriteit 8%

Ik weet dat dit een oudere thread is, maar ik wilde informatie geven die volgens mij nuttig is.

Persoonlijk gebruik ik PyPy, dat heel eenvoudig te installeren is met pip. Ik gebruik door elkaar de Python/PyPy-interpreter, je hoeft je code helemaal niet te veranderen en ik heb ontdekt dat deze ongeveer 40x sneller is dan de standaard Python-interpreter (Python 2x of 3x). Ik gebruik pyCharm Community Edition om mijn code te beheren en ik ben er dol op.

Ik schrijf graag code in python omdat ik denk dat je je daardoor meer op de taak kunt concentreren dan op de taal, wat voor mij een enorm pluspunt is. En als het nog sneller moet, kun je altijd compileren naar een binair bestand voor Windows, Linux of Mac (niet eenvoudig maar mogelijk met andere tools). Uit mijn ervaring krijg ik ongeveer 3,5x sneller dan PyPy bij het compileren, wat betekent dat ik 140x sneller ben dan python. PyPy is beschikbaar voor Python 3x- en 2x-code en nogmaals, als je een IDE zoals PyCharm gebruikt, kun je heel gemakkelijk wisselen tussen bijvoorbeeld PyPy, Cython en Python (het kost echter wat aanvankelijk leren en instellen).

Sommige mensen zullen hier misschien ruzie over maken, maar ik vind PyPy sneller dan Cython. Maar het zijn echter allebei geweldige keuzes.

Bewerken:ik wil nog een korte opmerking maken over compileren: wanneer je compileert, is het resulterende binaire bestand veel groter dan je python-script omdat het alle afhankelijkheden erin bouwt, enz. Maar dan je krijgt een paar duidelijke voordelen: snelheid!, nu werkt de app op elke machine (afhankelijk van het besturingssysteem waarvoor je hebt gecompileerd, zo niet alle. lol) zonder Python of bibliotheken, het vertroebelt ook je code en is technisch klaar voor ‘productie’ (tot op zekere hoogte). Sommige compilers genereren ook C-code, waar ik niet echt naar heb gekeken of gezien of het nuttig is of gewoon wartaal. Veel succes.

Hopelijk helpt dat.


Antwoord 6, autoriteit 6%

Een andere optie – om naast Shed Skinnaar C++ te converteren – is Pythran .

Om High Performance Python van Micha Gorelick en Ian Ozsvaldte citeren:

Pythran is een Python-naar-C++ compiler voor een subset van Python die:
bevat gedeeltelijke ondersteuning voor numpy. Het werkt een beetje als Numba en
Cython – u annoteert de argumenten van een functie en dan neemt het het over
met verdere typeannotatie en codespecialisatie. Het duurt
voordeel van vectorisatiemogelijkheden en van op OpenMP gebaseerde
parallellisatie mogelijkheden. Het werkt alleen met Python 2.7.

Een zeer interessante eigenschap van Pythran is dat het zal proberen om
automatisch parallellisatiemogelijkheden herkennen (bijv. als u
met behulp van een map), en zet dit om in parallelle code zonder dat er extra’s nodig zijn
inspanning van jou. U kunt ook parallelle secties specificeren met pragma omp> richtlijnen; in dit opzicht lijkt het erg op dat van Cython
OpenMP-ondersteuning.

Achter de schermen zal Pythran zowel normale Python- als numpy-code gebruiken
en probeer ze agressief te compileren in zeer snelle C++—zelfs
sneller dan de resultaten van Cython.

Houd er rekening mee dat dit een jong project is en dat u mogelijk tegenkomt
fouten; je moet er ook rekening mee houden dat het ontwikkelteam erg vriendelijk is
en hebben de neiging om bugs binnen enkele uren op te lossen.


Antwoord 7, autoriteit 4%

http://code.google.com/p/py2c/ziet eruit als een mogelijkheid – ze vermelden ook op hun site: Cython, Shedskin en RPython en bevestigen dat ze Python-code converteren naar pure C/C++, wat veel sneller is dan C/C++ vol met Python API-aanroepen. Opmerking: ik heb het nog niet geprobeerd, maar ik ga..


Antwoord 8, autoriteit 4%

Ik realiseer me dat een antwoord op een vrij nieuwe oplossing ontbreekt. Als Numpy in de code wordt gebruikt, raad ik aan om Pythran te proberen:

http://pythran.readthedocs.io/

Voor de functies die ik heb geprobeerd, geeft Pythran extreem goede resultaten. De resulterende functies zijn even snel als goed geschreven Fortran-code (of slechts iets langzamer) en een klein beetje sneller dan de (vrij geoptimaliseerde) Cython-oplossing.

Het voordeel ten opzichte van Cython is dat je alleen Pythran hoeft te gebruiken op de Python-functie die is geoptimaliseerd voor Numpy, wat betekent dat je de lussen niet hoeft uit te breiden en typen toe te voegen voor alle variabelen in de lus. Pythran neemt de tijd om de code te analyseren, zodat het de bewerkingen op numpy.ndarraybegrijpt.

Het is ook een enorm voordeel in vergelijking met Numba of andere projecten die gebaseerd zijn op just-in-time compilatie waarvoor (voor zover ik weet) je de loops moet uitbreiden om echt efficiënt te zijn. En dan wordt de code met de lussen heel erg inefficiënt met alleen CPython en Numpy…

Een nadeel van PyThran: geen klassen! Maar aangezien alleen de functies die echt moeten worden geoptimaliseerd moeten worden gecompileerd, is het niet erg irritant.

Nog een punt: PyThran ondersteunt goed (en zeer gemakkelijk) OpenMP-parallellisme. Maar ik denk niet dat MPI4PY wordt ondersteund …

Other episodes