¿Por qué el bucle trivial en Python se ejecuta mucho más lento que el mismo en C ++? ¿Y cómo optimizar eso?

simplemente ejecute un bucle for casi vacío en python y en C ++ (como sigue), la velocidad es muy diferente, el python es cien veces más lento.

a = 0 for i in xrange(large_const): a += 1 
 int a = 0; for (int i = 0; i < large_const; i++) a += 1; 

Además, ¿qué puedo hacer para optimizar la velocidad de python?

(Adición: Hice un mal ejemplo aquí en la primera versión de esta pregunta, realmente no quiero decir que a = 1 para que el comstackdor C / C ++ pueda optimizar eso, quiero decir que el bucle en sí consume una gran cantidad de recursos (tal vez debería usar a + = 1 como ejemplo) .. Y lo que quiero decir con cómo optimizar es que si el bucle for es como a + = 1 así de simple, ¿cómo podría ejecutarse a una velocidad similar a la de C / C ++? En la práctica, usé Numpy, así que ya no puedo usar pypy (por ahora), ¿existen algunos métodos generales para hacer un bucle mucho más rápido (como el generador en la lista de generación)?

Es probable que un comstackdor de C inteligente pueda optimizar su bucle reconociendo que al final, siempre habrá 1. Python no puede hacer eso porque al iterar sobre xrange , debe llamar a __next__ en el objeto xrange hasta que StopIteration . python no puede saber si __next__ tendrá un efecto secundario hasta que lo llame, por lo que no hay forma de optimizar el bucle. El mensaje para llevar de este párrafo es que es MUCHO MÁS DIFÍCIL optimizar un “comstackdor” de Python que un comstackdor de C porque Python es un lenguaje tan dynamic y requiere que el comstackdor sepa cómo se comportará el objeto en ciertas circunstancias. En C, eso es mucho más fácil porque C sabe exactamente qué tipo de cada objeto está adelantado.

Por supuesto, aparte del comstackdor, Python necesita hacer mucho más trabajo. En C , está trabajando con tipos base utilizando operaciones admitidas en las instrucciones de hardware . En Python, el intérprete está interpretando el código de byte una línea a la vez en el software . Claramente, esto llevará más tiempo que las instrucciones a nivel de máquina. Y el modelo de datos (por ejemplo, llamar a __next__ una y otra vez) también puede llevar a muchas llamadas de función que el C no necesita hacer. Por supuesto, Python hace esto para hacerlo mucho más flexible de lo que puedes tener en un lenguaje comstackdo.

La forma típica de acelerar el código de Python es usar bibliotecas o funciones intrínsecas que proporcionan una interfaz de alto nivel al código comstackdo de bajo nivel. scipy y numpy son excelentes ejemplos de este tipo de biblioteca. Otras cosas que puede considerar es el uso de pypy que incluye un comstackdor JIT, que probablemente no alcanzará las velocidades nativas, pero probablemente vencerá a Cpython (la implementación más común), o escribirá extensiones en C / fortran usando Cpython- API, cython o f2py para las secciones críticas de rendimiento del código.

Simplemente porque Python es un lenguaje de nivel más alto y tiene que hacer más cosas diferentes en cada iteración (como adquirir lockings, resolver variables, etc.)

“Cómo optimizar” es una pregunta muy vaga. No hay una forma “general” de optimizar cualquier progtwig de Python (todo lo posible ya fue hecho por los desarrolladores de Python). Su ejemplo particular puede ser optimizado de esta manera:

 a = 1 

Eso es lo que hará cualquier comstackdor de C, por cierto.

Si su progtwig funciona con datos numéricos, el uso de numpy y sus rutinas vectorizadas a menudo le brindan un gran aumento de rendimiento, ya que lo hace todo en C puro (usando bucles C, no en Python) y no tiene que bloquear el intérprete y todo estas cosas.

A medida que vayas más abstracto la velocidad bajará. El código más rápido es el código de ensamblaje que se escribe directamente.

Lea esta pregunta ¿Por qué los progtwigs de Python a menudo son más lentos que el progtwig equivalente escrito en C o C ++?

Python es (generalmente) un lenguaje interpretado, lo que significa que el script debe leerse línea por línea en tiempo de ejecución y sus instrucciones comstackdas en el código de bytes utilizable en ese momento.

C es (normalmente) un lenguaje comstackdo, por lo que para cuando lo ejecutas, estás trabajando con código de máquina puro.

Python nunca será tan rápido como C, por esa razón.

Edición: De hecho, Python comstack el código INTO C en tiempo de ejecución, por eso obtienes esos archivos .pyc.