Python vs Cpython


447

Cos'è tutto questo clamore su Python e CPython (Jython, IronPython) , non capisco:

python.org menziona che CPython è:

L'implementazione "tradizionale" di Python (soprannominata CPython)

un'altra domanda Stack Overflow menziona che:

CPython è l'interprete di codice byte predefinito di Python, che è scritto in C.

Onestamente non capisco cosa significano praticamente entrambe queste spiegazioni, ma quello che pensavo fosse che, se uso CPython, ciò significa che quando eseguo un codice Python di esempio, lo compila in linguaggio C e quindi lo esegue come se fosse C codice

Quindi cos'è esattamente CPython e in cosa differisce rispetto a Python e dovrei probabilmente usare CPython su Python e in caso affermativo quali sono i suoi vantaggi?


Risposte:


689

Quindi cos'è CPython?

CPython è l' implementazione originale di Python. È l'implementazione che scarichi da Python.org. La gente lo chiama CPython per distinguerlo dalle altre implementazioni successive di Python e per distinguere l'implementazione del motore del linguaggio dallo stesso linguaggio di programmazione Python .

L'ultima parte è da dove viene la tua confusione; devi mantenere Python-the-language separato da qualunque cosa esegua il codice Python.

CPython sembra essere implementato in C. Questo è solo un dettaglio di implementazione, davvero. CPython compila il codice Python in bytecode (in modo trasparente) e interpreta quel bytecode in un ciclo di valutazione.

CPython è anche il primo a implementare nuove funzionalità; Lo sviluppo di Python-the-language utilizza CPython come base; seguono altre implementazioni.

Che dire di Jython, ecc.?

Jython , IronPython e PyPy sono le attuali "altre" implementazioni del linguaggio di programmazione Python; questi sono implementati rispettivamente in Java, C # e RPython (un sottoinsieme di Python). Jython compila il codice Python in bytecode Java , quindi il tuo codice Python può essere eseguito su JVM. IronPython ti consente di eseguire Python su Microsoft CLR . E PyPy, essendo implementato in (un sottoinsieme di) Python, ti consente di eseguire il codice Python più velocemente di CPython, il che giustamente dovrebbe farti saltare la testa. :-)

In realtà compilando per C

Quindi CPython non traduce il tuo codice Python in C da solo. Al contrario, esegue un ciclo di interprete. V'è un progetto che fa tradurre il codice Python-ish a C, e che si chiama Cython . Cython aggiunge alcune estensioni al linguaggio Python e consente di compilare il codice in estensioni C, codice che si collega all'interprete CPython.


93
Penso che valga la pena ricordare che, in teoria, uno script Python potrebbe essere eseguito utilizzando una qualsiasi delle implementazioni, e i risultati dell'esecuzione dello script dovrebbero essere gli stessi.
Douglas Mendizábal,

3
È un dato di fatto, e in base al progetto a cui stai lavorando, potrebbe essere una buona idea testare e profilare il tuo codice Python su diverse implementazioni. Avendo lavorato su progetti Java + Jython in precedenza, puoi riscontrare molte sorprese perché gli sviluppatori non hanno testato abbastanza le loro librerie su questa piattaforma.
Rahmu,

9
Dire che "PyPy è più veloce di CPython" è un po 'pericoloso, direi. C'è un'ottima risposta proprio a questa domanda qui: stackoverflow.com/questions/18946662/…
Max Leske

Sono entusiasta di IronPython ... fino a quando ho visto che supporta solo Python 2.x.
Sean Anderson,

@SeanAnderson: lo stesso vale per Jython (fino al 2015 la versione ufficiale era compatibile solo con la 2.5, rendendola obsoleta di nove anni; nel 2015 hanno finalmente ottenuto una versione 2.7, ma ancora nessun segno di una versione 3.x).
ShadowRanger

90

Devi distinguere tra una lingua e un'implementazione. Python è una lingua,

Secondo Wikipedia , "Un linguaggio di programmazione è una notazione per scrivere programmi, che sono specifiche di un calcolo o algoritmo". Ciò significa che sono semplicemente le regole e la sintassi per scrivere il codice. Separatamente abbiamo un'implementazione del linguaggio di programmazione che nella maggior parte dei casi è l'attuale interprete o compilatore.

Python è una lingua. CPython è l'implementazione di Python in C. Jython è l'implementazione in Java e così via.

Per riassumere: stai già utilizzando CPython (se scaricato da qui ).


2
Dovresti leggere il post di Martijn Pieters "CPython non traduce il tuo codice Python in C da solo. Esegue invece un ciclo di interpreti. Esiste un progetto che traduce il codice Python-ish in C e che si chiama Cython"
Raymond Chenon

2
perché c'è così tanta enfasi su Cpython. vale a dire: non ascoltiamo Cc ++ o CJava o CSwift. Oppure mi sfugge qualcosa ?
Suhaib,

3
@Suhaib: sì, nel mondo Java le persone hanno ad esempio HotSpot, OpenJDK, IBM J9 JDK, Azul. Di solito sono più precisi, cioè non si vede davvero "installa Java" ma piuttosto "installa un Java 8 JDK compatibile, ad esempio Oracle JDK 8". Nel mondo JavaScript hai node.js, V8, ecc. Devi "installare node.js", non "installa JavaScript", giusto? Ma nel mondo Python è abbastanza comune dire semplicemente "installa Python 3.6" e fatto, facendo riferimento a una specifica del linguaggio, non a un runtime specifico.
Hendy Irawan,

37

Anche io ho avuto lo stesso problema nel capire come CPython, JPython, IronPython, PyPy siano diversi l'uno dall'altro.

Quindi, sono disposto a chiarire tre cose prima di iniziare a spiegare:

  1. Python : è un linguaggio, afferma / descrive solo come comunicare / esprimersi all'interprete (il programma che accetta il tuo codice python).
  2. Implementazione : si tratta di come l'interprete è stato scritto, in particolare, in quale lingua e cosa finisce per fare .
  3. Bytecode : è il codice che viene elaborato da un programma, di solito indicato come una macchina virtuale, piuttosto che dalla macchina "reale", il processore hardware.

CPython è l'implementazione, che è stata scritta in linguaggio C. Finisce per produrre bytecode (set di istruzioni basato su stack-machine) che è specifico di Python e quindi lo esegue. Il motivo per convertire il codice Python in un bytecode è perché è più semplice implementare un interprete se assomiglia alle istruzioni della macchina. Tuttavia, non è necessario produrre alcuni bytecode prima dell'esecuzione del codice Python (ma CPython produce).

Se vuoi guardare il bytecode di CPython, puoi farlo. Ecco come puoi:

>>> 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

Ora diamo un'occhiata al codice sopra. Le righe da 1 a 6 sono una definizione di funzione. Nella riga 8, importiamo il modulo 'dis' che può essere usato per visualizzare il bytecode Python intermedio (o si può dire, disassemblatore per bytecode Python) che viene generato da CPython (interprete).

NOTA : ho ottenuto il collegamento a questo codice dal canale IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

E poi, c'è Jython, che è scritto in Java e finisce per produrre codice byte Java. Il codice byte Java viene eseguito su Java Runtime Environment, che è un'implementazione di Java Virtual Machine (JVM). Se questo è confuso, sospetto che tu non abbia idea di come funzioni Java. In parole povere, il codice Java (il linguaggio, non il compilatore) è preso dal compilatore Java e genera un file (che è il codice byte Java) che può essere eseguito solo usando un JRE. Questo viene fatto in modo che, una volta compilato il codice Java, possa essere portato su altre macchine nel formato del codice byte Java, che può essere eseguito solo da JRE. Se questo è ancora confuso, allora potresti voler dare un'occhiata a questa pagina web .

Qui, potresti sospettare che il bytecode di CPython sia portatile come Jython, sospetto di no. Il bytecode prodotto nell'implementazione di CPython era specifico di quell'interprete per rendere più semplice l'ulteriore esecuzione del codice (ho anche il sospetto che, tale produzione intermedia di bytecode, solo per la facilità con cui l'elaborazione viene eseguita in molti altri interpreti).

Quindi, in Jython, quando compili il tuo codice Python, finisci con il codice byte Java, che può essere eseguito su una JVM.

Allo stesso modo, IronPython (scritto in linguaggio C #) compila il codice Python in Common Language Runtime (CLR), che è una tecnologia simile rispetto a JVM, sviluppata da Microsoft.


3
grazie per una spiegazione dettagliata !! Questo significa che CPython si occupa di convertire il codice Python in codice byte e anche di interpretare il codice byte in codice macchina? In poche parole CPython è Compiler (da Python a codice byte) e Python Virtual Machine (da codice byte a codice macchina)? Paragonando lo stesso a .Net, esiste un compilatore C # per convertire C # in MSIL e CLR per convertire da MSIL a codice macchina.
rahulaga_dev,

30

Questo articolo spiega a fondo la differenza tra le diverse implementazioni di Python. Come dice l'articolo:

La prima cosa da capire è che 'Python' è un'interfaccia. C'è una specifica di cosa dovrebbe fare Python e come dovrebbe comportarsi (come con qualsiasi interfaccia). E ci sono più implementazioni (come con qualsiasi interfaccia).

La seconda cosa da capire è che "interpretato" e "compilato" sono proprietà di un'implementazione, non di un'interfaccia.


20

Python è un linguaggio: un insieme di regole che possono essere utilizzate per scrivere programmi. Esistono diverse implementazioni di questa lingua.

Indipendentemente dall'implementazione che prendi, fanno praticamente la stessa cosa: prendi il testo del tuo programma e interpretalo, eseguendo le sue istruzioni. Nessuno di loro compila il tuo codice in C o in qualsiasi altra lingua.

CPython è l'implementazione originale, scritta in C. (La parte "C" in "CPython" si riferisce al linguaggio utilizzato per scrivere lo stesso interprete Python.)

Jython è lo stesso linguaggio (Python), ma implementato usando Java.

L'interprete IronPython è stato scritto in C #.

C'è anche PyPy - un interprete Python scritto in Python. Fai la tua scelta :)


8

implementationindica quale linguaggio è stato utilizzato per implementare Python e non come verrà implementato il codice python. Il vantaggio dell'uso di CPython è la disponibilità di C Run-time e la facile integrazione con C / C ++.

Quindi CPython è stato originariamente implementato usando C. C'erano altre forcelle all'implementazione originale che consentivano a Python di sfruttare Java (JYthon) o .NET Runtime (IronPython).

In base all'implementazione utilizzata, la disponibilità della libreria potrebbe variare, ad esempio Ctypes non è disponibile in Jython , quindi qualsiasi libreria che utilizza ctypes non funzionerebbe in Jython. Allo stesso modo, se si desidera utilizzare una classe Java, non è possibile farlo direttamente da CPython. O hai bisogno di una colla (JEPP) o devi usare Jython (The Java Implementation of Python)


4

Dovresti sapere che CPython non supporta realmente il multithreading a causa del Global Interpreter Lock . Inoltre non ha meccanismi di ottimizzazione per la ricorsione e presenta molte altre limitazioni che altre implementazioni e librerie tentano di colmare.

Dovresti dare un'occhiata a questa pagina sul wiki di Python.

Guarda i frammenti di codice in questa pagina, ti darà una buona idea di cosa sia un interprete.


17
CPython supporta il multithreading, ma GIL rende difficile sfruttare più core o CPU. Non è esattamente la stessa cosa che non supporta affatto il multithreading.
Martijn Pieters

0

L'implementazione originale e standard di Python viene solitamente chiamata CPythonquando si desidera contrastarla con le altre opzioni ( e altrimenti semplicemente "Python" ). Questo nome deriva dal fatto che è codificato in portatile ANSI C language code. Questo è il Python che prendi da http://www.python.org , ottieni con le distribuzioni ActivePython ed Enthought e hai automaticamente sulla maggior parte delle macchine Linux e Mac OS X. Se hai trovato una versione preinstallata di Python sul tuo computer, probabilmente è CPython, a meno che la tua azienda o organizzazione non stia utilizzando Python in modi più specializzati.

A meno che non si desideri eseguire lo script Javao le .NETapplicazioni con Python o trovare i vantaggi di Stacklesso PyPyconvincenti, probabilmente si desidera utilizzare il CPythonsistema standard . Poiché è l'implementazione di riferimento del linguaggio, tende a funzionare nel modo più veloce, essere il più completo ed essere più aggiornato e robusto rispetto ai sistemi alternativi.


3
Non intendo essere scortese, ma CPython non è assolutamente il più veloce.
Myles ha scavalcato il

0

Un'implementazione del linguaggio di programmazione è un sistema per l'esecuzione di programmi per computer.

Esistono due approcci generali all'implementazione del linguaggio di programmazione:

  • Interpretazione : un interprete prende come input un programma in una lingua ed esegue le azioni scritte in quella lingua su una macchina.
  • Compilazione : un compilatore accetta come input un programma in una lingua e traduce quel programma in un'altra lingua, che può servire come input per un altro interprete o un altro compilatore.

Python è un linguaggio di programmazione interpretato di alto livello creato da Guido van Rossum nel 1991.

CPython è la versione di riferimento del linguaggio di elaborazione Python, che è scritto in C creato anche da Guido van Rossum .

Altro elenco di implementazioni Python

fonte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.