¿Cómo compila Python algo de su código en C?

7

Leí que algunas construcciones de Python son más eficientes porque están compiladas en C.

enlace

Algunos de los ejemplos utilizados fueron map () y filter (). Me preguntaba cómo Python es capaz de hacer esto? Generalmente se interpreta, entonces, ¿cómo se compila parte del código mientras que otro se interpreta, y en un idioma diferente? ¿Por qué no simplemente compilar todo?

    
pregunta Howcan 23.08.2014 - 21:16

4 respuestas

6
  

Leí que algunas construcciones de Python son más eficientes porque están compiladas en C.

Eso no es cierto.

En primer lugar, no hay nada en la especificación del lenguaje Python que requiera que ciertas funciones se implementen en un idioma determinado. Un implementador de Python puede optar por implementar cualquier función y lenguaje de construcción que desee. Por ejemplo, en Jython, esas funciones se implementan en Java, no en C. En IronPython, se implementan en C #. En PyPy, pueden implementarse en RPython o simplemente en Python. En Pynie, probablemente se implementan en Python.

En segundo lugar, no hay nada en la especificación del lenguaje C que diga que debe compilarse. Hay intérpretes para C.

En tercer lugar, solo porque esté en C no significa que sea rápido. Hay compiladores de C por ahí que producen código realmente terrible, y hay implementaciones de Python bastante rápidas.

Y cuarto, incluso si la función implementada en C es increíblemente rápida, eso no necesariamente se traduce en una velocidad de ejecución más rápida del programa general. Las optimizaciones normalmente no funcionan en todos los idiomas. Por ejemplo, el optimizador no puede integrar la llamada a map en su programa, porque su programa está escrito en Python, pero map está escrito en C. Pero la integración es prácticamente la base de todas las optimizaciones, porque la integración (y bucle desenrollado) proporciona rutas largas y agradables de código sin ramas ni llamadas, que es lo que los optimizadores aman .

  

Generalmente se interpreta,

En realidad, todas las implementaciones existentes de Python siempre compilan el código de Python, nunca lo interpretan.

  

¿Por qué no solo compilar todo?

Esa es una buena pregunta! Escribir todo en el mismo idioma tiene muchas ventajas, algunas de las cuales mencioné anteriormente. (Otra es que es más fácil encontrar colaboradores que conozcan un idioma que dos).

Si todo está escrito en el mismo idioma, las mejoras de rendimiento de ese idioma se multiplican en todo el sistema. Si todo está escrito en C, entonces hacer que Python sea 10 veces más rápido no acelerará mucho tu programa, porque la mayoría del código no es Python. Claro, el código que escribiste se está ejecutando 10 veces más rápido, pero ese código consiste principalmente en llamadas a funciones de C que tienen la misma velocidad que antes.

Pero si todo está escrito en Python, hacer que Python sea más rápido tendrá un efecto dominó: los tipos primitivos se vuelven más rápidos, las estructuras de datos construidas sobre esos tipos primitivos se vuelven más rápidas, los algoritmos que usan esas estructuras de datos se vuelven más rápidos, los módulos que usan esos algoritmos se vuelven más rápidos y así sucesivamente.

    
respondido por el Jörg W Mittag 23.08.2014 - 22:53
10

El intérprete está escrito en C (o al menos la implementación de referencia es CPython). Eso significa que cada función de lenguaje se implementa con una pequeña función en C Todo lo que hace el intérprete es leer el código fuente para averiguar a cuál de estas pequeñas funciones llamar.

Esto significa que no es un problema delegar funciones más complejas a implementaciones de C

.

Estas funciones no están compiladas con su programa. Ya existen en forma compilada en el intérprete de Python, que solo los llama cuando los encuentra en su código fuente.

    
respondido por el Philipp 23.08.2014 - 21:28
4

Decir que están "compilados en C" es una declaración un poco confusa. Permítame reformularlo: CPython (la implementación más extendida del intérprete de Python, a la que se refiere) es un programa en C, y esas son funciones de C integradas en el intérprete, no el código de Python que el intérprete elige mágicamente para compilar a C.

Cuando alimenta un archivo .py a Python, lo analiza y convierte cada función en un código de bytes, es decir, una forma binaria compacta de las operaciones que realiza la función. Esto se envía a la máquina virtual de Python, una parte del intérprete que lee el código de bytes y hace lo que le indica que haga.

Cuando llamas a funciones escritas en Python, nada especial sucede: la máquina virtual simplemente saltará para interpretar su código de bytes; pero cuando llama a una función que está incorporada dentro del intérprete, el intérprete llama a la función C correspondiente que tiene incorporada (esto sucede todo el tiempo, por ejemplo, la mayoría de las operaciones en tipos primitivos en realidad se realizan mediante un código compilado directamente dentro del intérprete ).

Las funciones escritas en C en CPython son generalmente más rápidas, ya que están escritas en un lenguaje que está diseñado para un alto rendimiento, compilado a un código nativo (no se necesita un intérprete, se ejecuta directamente en la CPU) y es más sencillo, menos semántica dinámica (por ejemplo, en Python, cada acceso a un miembro es una búsqueda compleja de tabla hash, en C puede reducirse a una sola instrucción de ensamblaje).

  

En general, se interpreta, por lo tanto, ¿cómo se compila parte del código mientras se interpreta a otro, y en un idioma diferente? ¿Por qué no simplemente compilar todo?

Parece que piensas que es el intérprete el que decide qué código se compila y qué se interpreta; esa es una premisa equivocada Las partes compiladas son código que está escrito directamente en C por los desarrolladores de CPython , y se compila dentro del intérprete cuando se crea el intérprete (Python puede llamar a otro código escrito en C u otros lenguajes compilados si está compilado en extensiones de Python o vía ctypes). Todo lo que el intérprete de CPython puede hacer cuando ejecuta es simplemente interpretar Python y llamar a las funciones C ya hechas.

    
respondido por el Matteo Italia 24.08.2014 - 03:38
3

No está "compilado en C" per se: map y filter son funciones integradas de la biblioteca estándar, que se proporciona mediante la implementación del lenguaje (en este caso, CPython). Dado que CPython está escrito en C, puede implementar fácilmente cualquiera de sus funciones primitivas en C si es necesario.

    
respondido por el Rufflewind 23.08.2014 - 21:28

Lea otras preguntas en las etiquetas