Python vs Cpython

447

O que é todo esse barulho sobre Python e CPython (Jython, IronPython) , não entendi:

O python.org menciona que o CPython é:

A implementação "tradicional" do Python (apelidada de CPython)

ainda outra pergunta do Stack Overflow menciona que:

CPython é o interpretador de código de bytes padrão do Python, escrito em C.

Honestamente, eu não entendo o que essas duas explicações praticamente significam, mas o que eu pensei foi que, se eu usar o CPython, isso significa que quando eu executo um código python de amostra, ele o compila na linguagem C e depois o executa como se fosse C código

Então, o que exatamente é o CPython e como ele difere quando comparado ao python? Eu provavelmente deveria usar o CPython sobre Python? Em caso afirmativo, quais são suas vantagens?

K DawG
fonte

Respostas:

689

Então, o que é CPython?

CPython é a implementação original do Python. É a implementação que você baixa do Python.org. As pessoas chamam de CPython para diferenciá-lo de outras implementações posteriores do Python e para distinguir a implementação do mecanismo de linguagem da linguagem de programação Python. própria .

A última parte é de onde vem sua confusão; você precisa manter o Python-the-language separado do que executa o código Python.

CPython acontece a ser implementado em C. Isso é apenas um detalhe de implementação, realmente. O CPython compila seu código Python em bytecode (transparente) e interpreta esse bytecode em um loop de avaliação.

O CPython também é o primeiro a implementar novos recursos; O desenvolvimento Python-the-language usa CPython como base; outras implementações seguem.

E o Jython, etc.?

Jython , IronPython e PyPy são as "outras" implementações atuais da linguagem de programação Python; estes são implementados em Java, C # e RPython (um subconjunto de Python), respectivamente. O Jython compila seu código Python no bytecode Java , para que seu código Python possa ser executado na JVM. O IronPython permite executar o Python no Microsoft CLR . E o PyPy, sendo implementado em (um subconjunto) do Python, permite executar o código Python mais rápido que o CPython, o que, com razão, deve surpreender sua mente. :-)

Realmente compilando para C

Portanto, o CPython não traduz seu código Python para C por si só. Em vez disso, ele executa um loop de intérprete. Não é um projeto que faz traduzir código Python-ish para C, e que é chamado Cython . O Cython adiciona algumas extensões à linguagem Python e permite que você compile seu código em extensões C, código que se conecta ao interpretador CPython.

Martijn Pieters
fonte
93
Acho que vale a pena mencionar que, em teoria, um script python pode ser executado usando qualquer uma das implementações, e os resultados da execução do script devem ser os mesmos.
Douglas Mendizábal 16/06
3
Por uma questão de fato, e dependendo do projeto em que você está trabalhando, pode ser uma boa ideia testar e criar um perfil do seu código Python em várias implementações. Tendo trabalhado em projetos Java + Jython antes, você pode ter muitas surpresas porque os desenvolvedores não testaram suas bibliotecas o suficiente nesta plataforma.
rahmu
9
Dizer que "PyPy é mais rápido que CPython" é um pouco perigoso, eu diria. Há uma resposta muito boa para precisamente essa pergunta aqui: stackoverflow.com/questions/18946662/...
Max Leske
Fiquei empolgado com o IronPython ... até que vi que ele suporta apenas o Python 2.x.
Sean Anderson
@SeanAnderson: O mesmo vale para o Jython (até 2015, o lançamento oficial era compatível apenas com 2.5, o que significa nove anos desatualizado; eles finalmente conseguiram o lançamento do 2.7 em 2015, mas ainda não dão sinal de um lançamento do 3.x).
ShadowRanger
90

Você precisa distinguir entre um idioma e uma implementação. Python é uma linguagem,

Segundo a Wikipedia , "Uma linguagem de programação é uma notação para escrever programas, que são especificações de uma computação ou algoritmo". Isso significa que são simplesmente as regras e a sintaxe para escrever código. Separadamente, temos uma implementação de linguagem de programação que, na maioria dos casos, é o intérprete ou compilador real.

Python é uma linguagem. CPython é a implementação do Python em C. Jython é a implementação em Java e assim por diante.

Para resumir: Você já está usando o CPython (se você baixou aqui ).

jamylak
fonte
2
Você deve ler o post de Martijn Pieters "O CPython não traduz seu código Python para C por si só. Em vez disso, executa um loop de intérpretes. Existe um projeto que traduz o código Python-ish para C, chamado Cython"
Raymond Chenon 30/03
2
por que há tanta ênfase no Cpython. ou seja: não ouvimos Cc ++ ou CJava ou mesmo CSwift. Ou eu estou esquecendo de alguma coisa ?
Suhaib 01/10/19
3
@ Suhaib: sim, no mundo Java as pessoas têm, por exemplo, HotSpot, OpenJDK, IBM J9 JDK, Azul. Eles geralmente são mais precisos, ou seja, você realmente não vê "instalar Java", mas sim "instala um Java 8 JDK compatível, por exemplo, Oracle JDK 8". No mundo do JavaScript, você tem o node.js, V8, etc. Você "instala o node.js", não o "instala o JavaScript", certo? Mas no mundo Python, é bastante comum apenas dizer "instalar Python 3.6" e pronto, referindo-se a uma especificação de linguagem, não a um tempo de execução específico.
Hendy Irawan
37

Até eu tive o mesmo problema ao entender como CPython, JPython, IronPython, PyPy são diferentes entre si.

Então, estou disposto a esclarecer três coisas antes de começar a explicar:

  1. Pitão : é uma linguagem, apenas afirma / descreve como se comunicar / se expressar para o intérprete (o programa que aceita seu código python).
  2. Implementação : trata-se de como o intérprete foi escrito, especificamente, em qual idioma e o que ele acaba fazendo .
  3. Bytecode : é o código que é processado por um programa, geralmente chamado de máquina virtual, e não pela máquina de computador "real", o processador de hardware.

CPython é a implementação, que foi escrita em linguagem C. Ele acaba produzindo bytecode (conjunto de instruções baseado em máquina de pilha), que é específico do Python e depois o executa. O motivo para converter o código Python em um bytecode é porque é mais fácil implementar um intérprete se parecer com instruções da máquina. Mas, não é necessário produzir algum bytecode antes da execução do código Python (mas o CPython produz).

Se você quiser examinar o bytecode do CPython, poderá. Veja como você pode:

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

Agora, vamos dar uma olhada no código acima. As linhas 1 a 6 são uma definição de função. Na linha 8, importamos o módulo 'dis' que pode ser usado para visualizar o bytecode intermediário do Python (ou você pode dizer, desmontador do bytecode do Python) gerado pelo CPython (intérprete).

NOTA : Eu obtive o link para esse código no canal #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

E há o Jython, que é escrito em Java e acaba produzindo código de bytes Java. O código de byte Java é executado no Java Runtime Environment, que é uma implementação da Java Virtual Machine (JVM). Se isso é confuso, suspeito que você não tenha idéia de como o Java funciona. Em termos leigos, o código Java (a linguagem, não o compilador) é obtido pelo compilador Java e gera um arquivo (que é o código de bytes Java) que pode ser executado apenas usando um JRE. Isso é feito para que, uma vez que o código Java seja compilado, ele possa ser portado para outras máquinas no formato de código de bytes Java, que possa ser executado apenas pelo JRE. Se isso ainda é confuso, você pode dar uma olhada nesta página da web .

Aqui, você pode perguntar se o bytecode do CPython é portátil como o Jython, suspeito que não. O bytecode produzido na implementação do CPython foi específico para esse intérprete, facilitando a execução adicional do código (também suspeito que essa produção intermediária de bytecode seja apenas pela facilidade de processamento em muitos outros intérpretes).

Portanto, no Jython, quando você compila seu código Python, você acaba com o código de bytes Java, que pode ser executado em uma JVM.

Da mesma forma, o IronPython (escrito em linguagem C #) compila seu código Python para Common Language Runtime (CLR), que é uma tecnologia semelhante à JVM, desenvolvida pela Microsoft.

Vijay Kumar
fonte
3
thx para explicação detalhada !! Isso significa que o CPython cuida da conversão do código Python em código de bytes e também interpreta o código de bytes em código de máquina? Em poucas palavras, o CPython é Compiler (para Python para código de bytes) e Python Virtual Machine (para código de bytes para código de máquina)? Comparando o mesmo com o .Net, existe o Compilador C # para converter C # para MSIL e CLR para converter de MSIL para código de máquina.
Rhulaga_dev 2/11
30

Este artigo explica completamente a diferença entre diferentes implementações do Python. Como o artigo coloca:

A primeira coisa a perceber é que 'Python' é uma interface. Há uma especificação do que o Python deve fazer e como ele deve se comportar (como em qualquer interface). E há várias implementações (como em qualquer interface).

A segunda coisa a entender é que 'interpretado' e 'compilado' são propriedades de uma implementação, não uma interface.

shaktimaan
fonte
20

Python é uma linguagem: um conjunto de regras que podem ser usadas para escrever programas. Existem várias implementações dessa linguagem.

Não importa qual implementação você faça, eles fazem praticamente a mesma coisa: pegue o texto do seu programa e interprete-o, executando suas instruções. Nenhum deles compila seu código em C ou em qualquer outro idioma.

CPython é a implementação original, escrita em C. (A parte "C" em "CPython" refere-se à linguagem que foi usada para escrever o próprio interpretador Python.)

Jython é a mesma linguagem (Python), mas implementada usando Java.

O interpretador IronPython foi escrito em C #.

Há também PyPy - um intérprete Python escrito em Python. Faça a sua escolha :)

orlenko
fonte
8

implementationsignifica que linguagem foi usada para implementar o Python e não como o código do python seria implementado. A vantagem de usar o CPython é a disponibilidade do tempo de execução C e a fácil integração com o C / C ++.

Então o CPython foi originalmente implementado usando C . Havia outros garfos na implementação original que permitiam ao Python aproveitar Java (JYthon) ou .NET Runtime (IronPython).

Com base em qual implementação você usa, a disponibilidade da biblioteca pode variar, por exemplo, Ctypes não está disponível no Jython , portanto, qualquer biblioteca que use ctypes não funcionaria no Jython. Da mesma forma, se você deseja usar uma classe Java, não pode fazê-lo diretamente do CPython. Você precisa de uma cola (JEPP) ou precisa usar o Jython (a implementação Java do Python)

Abhijit
fonte
4

Você deve saber que o CPython realmente não suporta multithreading por causa do bloqueio global de intérpretes . Ele também não possui mecanismos de otimização para recursão e possui muitas outras limitações que outras implementações e bibliotecas tentam preencher.

Você deve dar uma olhada nesta página no wiki do python.

Veja os trechos de código nesta página, e você terá uma boa idéia do que é um intérprete.

Oussama L.
fonte
17
O CPython suporta multithreading, mas o GIL dificulta o aproveitamento de vários núcleos ou CPUs. Isso não é exatamente o mesmo que não oferecer suporte a multithreading.
Martijn Pieters
0

A implementação original e padrão do Python geralmente é chamada CPythonquando você deseja contrastá-lo com as outras opções ( e simplesmente “Python”, caso contrário ). Esse nome vem do fato de estar codificado em portátil ANSI C language code. Este é o Python que você busca em http://www.python.org , obtém as distribuições ActivePython e Enthought e possui automaticamente na maioria das máquinas Linux e Mac OS X. Se você encontrou uma versão pré-instalada do Python em sua máquina, provavelmente é CPython, a menos que sua empresa ou organização esteja usando o Python de maneiras mais especializadas.

A menos que você queira criar scripts Javaou .NETaplicativos com o Python ou encontrar os benefícios Stacklessou vantagens PyPy, provavelmente deseja usar o CPythonsistema padrão . Por ser a implementação de referência da linguagem, ela tende a ser a mais rápida, a mais completa e a ser mais atualizada e robusta que os sistemas alternativos.

Sushant Chaudhary
fonte
3
Não pretendo ser rude, mas o CPython absolutamente não roda mais rápido.
Myles Hollowed
0

Uma implementação de linguagem de programação é um sistema para executar programas de computador.

Existem duas abordagens gerais para a implementação da linguagem de programação:

  • Interpretação : Um intérprete recebe como entrada um programa em algum idioma e executa as ações escritas nesse idioma em alguma máquina.
  • Compilação : Um compilador toma como entrada um programa em algum idioma e converte esse programa em outro idioma, que pode servir como entrada para outro intérprete ou outro compilador.

Pitão é uma linguagem de programação interpretada de alto nível criada por Guido van Rossum em 1991.

CPython é a versão de referência da linguagem de computação Python, escrita em C criada por Guido van Rossum .

Outra lista de implementações em Python

Fonte

Premraj
fonte