Python versus Cpython

Wat is al die ophef over Python en CPython (Jython,IronPython), ik snap het niet:

python.org vermeldt dat CPython is:

De “traditionele” implementatie van Python (bijgenaamd CPython)

nog een andere Stack Overflow-vraag vermeldt dat:

CPython is de standaard bytecode-interpreter van Python, die is geschreven in C.

Eerlijk gezegd begrijp ik niet wat beide verklaringen praktisch betekenen, maar wat ik dacht was dat, als ik CPython gebruik, dat betekent dat wanneer ik een voorbeeldpython-code uitvoer, deze wordt gecompileerd naar C-taal en vervolgens wordt uitgevoerd het alsof het een C-code is

Dus wat is CPython precies en hoe verschilt het in vergelijking met python en moet ik waarschijnlijk CPython gebruiken in plaats van Python en zo ja, wat zijn de voordelen ervan?


Antwoord 1, autoriteit 100%

Dus wat is CPython?

CPython is de originele Python-implementatie. Het is de implementatie die u downloadt van Python.org. Mensen noemen het CPython om het te onderscheiden van andere, latere Python-implementaties, en om de implementatie van de taalengine te onderscheiden van de Python programmeertaal zelf.

Het laatste deel is waar je verwarring vandaan komt; je moet Python-de-taal gescheiden houden van alles wat de Python-code draait.

CPython toevallig is geïmplementeerd in C. Dat is eigenlijk maar een implementatiedetail. CPython compileert uw Python-code in bytecode (transparant) en interpreteert die bytecode in een evaluatielus.

CPython is ook de eerste die nieuwe functies implementeert; Python-de-taalontwikkeling gebruikt CPython als basis; andere implementaties volgen.

Hoe zit het met Jython, enz.?

Jython, IronPython en PyPy zijn de huidige “andere” implementaties van de programmeertaal Python; deze zijn geïmplementeerd in respectievelijk Java, C# en RPython (een subset van Python). Jython compileert je Python-code naar Java bytecode, zodat je Python-code op de JVM kan draaien. IronPython laat je Python draaien op de Microsoft CLR. En met PyPy, geïmplementeerd in (een subset van) Python, kun je Python-code sneller uitvoeren dan CPython, wat je terecht zou verbazen. 🙂

Eigenlijk compileren naar C

Dus CPython vertaalt niet zelf je Python-code naar C. In plaats daarvan voert het een tolklus uit. Er is een project dat de Python-achtige code vertaalt naar C, en dat heet Cython. Cython voegt een paar extensies toe aan de Python-taal, en laat je je code compileren naar C-extensies, code die in de CPython-interpreter plugt.


Antwoord 2, autoriteit 14%

Je moet onderscheid maken tussen een taal en een implementatie. Python is een taal,

Volgens Wikipedia: “Een programmeertaal is een notatie voor het schrijven van programma’s, wat specificaties zijn van een berekening of algoritme”. Dit betekent dat het gewoon de regels en syntaxis zijn voor het schrijven van code. Afzonderlijk hebben we een programmeertaalimplementatie die in de meeste gevallen de eigenlijke tolk of compiler is.

Python is een taal.
CPython is de implementatie van Python in C. Jython is de implementatie in Java, enzovoort.

Samenvattend: je gebruikt CPython al (als je hebt gedownload van hier).


Antwoord 3, autoriteit 6%

Zelfs ik had hetzelfde probleem om te begrijpen hoe CPython, JPython, IronPython en PyPy van elkaar verschillen.

Dus ik ben bereid drie dingen duidelijk te maken voordat ik begin met uitleggen:

  1. Python: het is een taal, het vermeldt/beschrijft alleen hoe u uzelf kunt overbrengen/uitdrukken aan de tolk (het programma dat uw python-code accepteert).
  2. Implementatie: het gaat erom hoe de tolk is geschreven, met name in welke taal en wat hij uiteindelijk doet.
  3. Bytecode: het is de code die wordt verwerkt door een programma, meestal een virtuele machine genoemd, in plaats van door de “echte” computermachine, de hardwareprocessor.

CPython is de implementatie, die was
geschreven in C-taal. Het produceert uiteindelijk bytecode (stack-machine
gebaseerde instructieset) die Python-specifiek is en deze vervolgens uitvoert.
De reden om Python-code naar een bytecode te converteren is omdat het gemakkelijker is om:
implementeer een interpreter als het lijkt op machine-instructies. Maar,
het is niet nodig om wat bytecode te produceren voorafgaand aan de uitvoering van de
Python-code (maar CPython produceert wel).

Als je de bytecode van CPython wilt bekijken, dan kan dat. Zo kun je:

>>> def f(x, y):                # line 1
...    print("Hello")           # line 2
...    if x:                    # line 3
...       y += x                # line 4
...    print(x, y)              # line 5
...    return x+y               # line 6
...                             # line 7
>>> import dis                  # line 8
>>> dis.dis(f)                  # line 9
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello')
              4 CALL_FUNCTION            1
              6 POP_TOP
  3           8 LOAD_FAST                0 (x)
             10 POP_JUMP_IF_FALSE       20
  4          12 LOAD_FAST                1 (y)
             14 LOAD_FAST                0 (x)
             16 INPLACE_ADD
             18 STORE_FAST               1 (y)
  5     >>   20 LOAD_GLOBAL              0 (print)
             22 LOAD_FAST                0 (x)
             24 LOAD_FAST                1 (y)
             26 CALL_FUNCTION            2
             28 POP_TOP
  6          30 LOAD_FAST                0 (x)
             32 LOAD_FAST                1 (y)
             34 BINARY_ADD
36 RETURN_VALUE

Laten we nu eens kijken naar de bovenstaande code. Regels 1 tot en met 6 zijn een functiedefinitie. In regel 8 importeren we de ‘dis’-module die kan worden gebruikt om de tussenliggende Python-bytecode (of je kunt zeggen, disassembler voor Python-bytecode) te bekijken die wordt gegenereerd door CPython (interpreter).

OPMERKING: ik heb de link naar deze code van #python IRC-kanaal: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

En dan is er Jython, dat in Java is geschreven en uiteindelijk Java-bytecode produceert. De Java-bytecode draait op Java Runtime Environment, een implementatie van Java Virtual Machine (JVM). Als dit verwarrend is, vermoed ik dat je geen idee hebt hoe Java werkt. In termen van leken wordt Java-code (de taal, niet de compiler) door de Java-compiler genomen en voert een bestand uit (dat Java-bytecode is) dat alleen kan worden uitgevoerd met behulp van een JRE. Dit wordt gedaan zodat, zodra de Java-code is gecompileerd, deze naar andere machines kan worden geporteerd in Java-bytecode-indeling, die alleen door JRE kan worden uitgevoerd. Als dit nog steeds verwarrend is, wil je misschien deze webpagina bekijken .

Hier kun je je afvragen of de bytecode van de CPython draagbaar is zoals Jython, ik vermoed van niet. De bytecode geproduceerd in CPython-implementatie was specifiek voor die interpreter om het gemakkelijk te maken voor verdere uitvoering van code (ik vermoed ook dat dergelijke tussenliggende bytecode-productie, alleen voor het gemak van verwerking wordt gedaan in veel andere tolken).

Dus in Jython, als je je Python-code compileert, krijg je Java-bytecode, die op een JVM kan worden uitgevoerd.

Op dezelfde manier compileert IronPython (geschreven in C#-taal) uw Python-code naar Common Language Runtime (CLR), een vergelijkbare technologie als JVM, ontwikkeld door Microsoft.


Antwoord 4, autoriteit 4%

Dit artikel legt het verschil tussen verschillende implementaties van Python grondig uit. Zoals het artikel zegt:

Het eerste dat u moet beseffen, is dat Python een interface is. Er is een
specificatie van wat Python zou moeten doen en hoe het zich zou moeten gedragen (as
met elke interface). En er zijn meerdere implementaties (zoals bij
elke interface).

Het tweede dat u moet beseffen, is dat geïnterpreteerd en gecompileerd zijn
eigenschappen van een implementatie, geen interface.


Antwoord 5, autoriteit 3%

Python is een taal: een set regels die kunnen worden gebruikt om programma’s te schrijven. Er zijn verschillende implementaties van deze taal.

Het maakt niet uit welke implementatie je neemt, ze doen vrijwel hetzelfde: de tekst van je programma nemen en het interpreteren, waarbij de instructies worden uitgevoerd. Geen van hen compileert uw code in C of een andere taal.

CPython is de originele implementatie, geschreven in C. (Het “C”-gedeelte in “CPython” verwijst naar de taal die werd gebruikt om de Python-interpreter zelf te schrijven.)

Jython is dezelfde taal (Python), maar geïmplementeerd met Java.

IronPython-interpreter is geschreven in C#.

Er is ook PyPy – een Python-interpreter geschreven in Python. Maak uw keuze 🙂


Antwoord 6

implementation betekent welke taal werd gebruikt om Python te implementeren en niet hoe Python Code zou worden geïmplementeerd. Het voordeel van het gebruik van CPython is de beschikbaarheid van C Run-time en de gemakkelijke integratie met C/C++.

Dus CPython werd oorspronkelijk geïmplementeerd met behulp van C. Er waren andere forks naar de originele implementatie die Python in staat stelde om Java (JYthon) of .NET Runtime (IronPython) te verbeteren.

Op basis van de implementatie die u gebruikt, kan de beschikbaarheid van de bibliotheek variëren, bijvoorbeeld Ctypes is niet beschikbaar in Jython , dus elke bibliotheek die ctypes gebruikt, zou niet werken in Jython. Evenzo, als u een Java-klasse wilt gebruiken, kunt u dit niet rechtstreeks vanuit CPython doen. Je hebt ofwel een lijm (JEPP) nodig of je moet Jython gebruiken (The Java Implementation of Python)


Antwoord 7

Je moet weten dat CPython niet echt multithreading ondersteunt (wel, maar niet optimaal) vanwege de Globaal Interpreter Lock. Het heeft ook geen optimalisatiemechanismen voor recursie en heeft vele andere beperkingen die andere implementaties en bibliotheken proberen te vullen.

Je zou deze pagina op de pythonwiki moeten bekijken.

Kijk naar de codefragmenten op deze pagina, het geeft je een goed idee van wat een tolk is.


Antwoord 8

De originele en standaard implementatie van Python wordt gewoonlijk CPython genoemd wanneer
je wilt het contrasteren met de andere opties (en anders gewoon Python ). Deze
naam komt van het feit dat het is gecodeerd in draagbare ANSI C language code. Dit is
de Python die je ophaalt van http://www.python.org, krijg met de ActivePython en
Doordachte-distributies, en hebben automatisch op de meeste Linux- en Mac OS X-machines.
Als je een voorgeïnstalleerde versie van Python op je computer hebt gevonden, is dat waarschijnlijk
CPython, tenzij uw bedrijf of organisatie Python gebruikt in meer gespecialiseerde
manieren.

Tenzij u Java– of .NET-toepassingen wilt scripten met Python of de voordelen wilt vinden
van Stackless of PyPy overtuigend, wilt u waarschijnlijk de standaard CPython systeem.
Omdat het de referentie-implementatie van de taal is, heeft het de neiging om de
snelste, de meest complete en actueler en robuuster zijn dan het alternatief
systemen.


Antwoord 9

Een programmeertaalimplementatie is een systeem voor het uitvoeren van computerprogramma’s.

Er zijn twee algemene benaderingen voor de implementatie van programmeertalen:

  • Interpretatie: een tolk neemt als invoer een programma in een bepaalde taal en voert de acties uit die in die taal zijn geschreven op een of andere machine.
  • Compilatie: een compiler neemt een programma in een bepaalde taal als invoer en vertaalt dat programma in een andere taal, die kan dienen als invoer voor een andere interpreter of een andere compiler.

Python is een geïnterpreteerde programmeertaal op hoog niveau, gemaakt door Guido van Rossum in 1991.

CPython is een referentieversie van de Python-computertaal, die ook in C is geschreven door Guido van Rossum.

Andere lijst met Python-implementaties

Bron


Antwoord 10

Omdat python open source is, kunnen we python aanpassen aan onze vereisten. Na maatwerk kunnen we die versie een naam geven zoals we willen. Daarom zijn er meerdere smaken python verkrijgbaar. Elke smaak is een aangepaste versie van python om aan een speciale eis te voldoen. Het is vergelijkbaar met het feit dat er meerdere smaken van UNIX zijn, zoals Ubuntu, Linux, RedHat Linux enz. Hieronder staan ​​enkele smaken van python:

  • CPythonStandaard implementatie van python programmeertaal die we downloaden van python.org, geleverd door python software foundation. Het is geschreven in C en python. Het staat ons niet toe om C-code te schrijven, alleen python-code is toegestaan. CPython kan worden aangeroepen als zowel een interpreter als een compiler, aangezien hier onze python-code eerst wordt gecompileerd naar python-bytecode en vervolgens wordt de bytecode geïnterpreteerd door PVM of Python Virtual Machine

  • Cython – Cython is een programmeertaal die een superset is van python en C. Het is geschreven in C en python. Het is ontworpen om C-achtige prestaties te leveren met python-syntaxis en optionele C-syntaxis. Cython is een gecompileerde taal omdat het C-code genereert en wordt gecompileerd door de C-compiler. We kunnen vergelijkbare code schrijven in Cython en in standaard python of CPython zijn de verschillen:

    • Cython stelt ons in staat om optionele aanvullende C-code te schrijven en,
    • In Cython wordt onze python-code intern vertaald in C-code zodat deze kan worden gecompileerd door de C-compiler. Hoewel Cython resulteert in een aanzienlijk snellere uitvoering, maar niet voldoet aan de oorspronkelijke C-taaluitvoering. Dit is omdat Cython de CPython-interpreter en CPython-standaardbibliotheken moet aanroepen voor uitvoering omdat het afhankelijk is van hen om de geschreven CPython-code te begrijpen
  • JPython / JythonJava-implementatie van de programmeertaal python. Het is geschreven in Java en Python. Hier wordt onze python-code eerst gecompileerd naar Java bytecode en die bytecode wordt geïnterpreteerd door JVM of Java Virtual Machine

  • PyPyRPython-implementatie van de programmeertaal python. Het is geschreven in een beperkte subset van python genaamd Restricted Python (RPython). PyPy werkt sneller dan CPython omdat om bytecode te interpreteren, PyPy een Just-in-time Compiler heeft terwijl CPython een Interpreter heeft. PyPy streeft ernaar een gemeenschappelijk vertaal- en ondersteuningskader te bieden voor het produceren van implementaties van dynamische talen, waarbij er een duidelijke scheiding zal zijn tussen taalspecificatie en implementatie.

    • Compiler vertaalt onze broncode op hoog niveau in bytecode en om bytecode in machinecode te vertalen, sommige implementaties hebben een normale interpreter, sommige hebben Just-in-time compiler. Om een ​​lus uit te voeren die bijvoorbeeld een miljoen keer wordt uitgevoerd, vertaalt een JIT-compiler bytecode slechts één keer in machinecode en voor de volgende iteraties begrijpt de machine alleen de bytecode. Terwijl normale tolk, in elke iteratie, bytecode herhaaldelijk in machinecode vertaalt, waardoor er meer tijd nodig is om een ​​lus te voltooien die bijvoorbeeld een miljoen keer wordt uitgevoerd
  • IronPythonC#-implementatie van python, gericht op het .NET-framework

  • Ruby Python – werkt met Ruby-platform

  • Anaconda PythonDistributie van python- en R-programmeertalen voor wetenschappelijk computergebruik zoals datawetenschap, machine learning, kunstmatige intelligentie, diep leren, verwerken van grote hoeveelheden gegevens enz. Talloze aantal bibliotheken zoals scikit-learn, tensorflow, pytorch, numba, pandas, jupyter, numpy, matplotlib enz. zijn beschikbaar bij dit pakket

  • StacklessPython voor gelijktijdigheid

Om de snelheid van elke implementatie te testen, schrijven we een programma om integratie_f 500 keer aan te roepen met een N-waarde van 50.000, en registreren we de uitvoeringstijd over verschillende runs. Onderstaande tabel toont de benchmarkresultaten:

Implementatie Uitvoeringstijd (seconden) Versnellen
CPython 9,25
CPython + Cython 0,21 44x
PyPy 0,57 16x

LEAVE A REPLY

Please enter your comment!
Please enter your name here

five × 4 =

Other episodes