Compilar código python

Juanjo Alvarez juanjux en yahoo.es
Mie Mar 6 00:47:30 CET 2002


On Tue, Mar 05, 2002 at 08:35:42PM +0100, Jorge Ayora wrote:
> ¿Cómo se puede compilar código fuente python?
> Se supone que irá más rápido, no??

Sí, iría más rápido... si existiera un compilador completo, pero de
momento no lo hay. Existen aproximaciones pero de momento bastante
incompletas (tiempo...) porque es muy dificil compilar Python por su
carácter intrínsecamente dinámico.

De todas formas, la mejor manera de optimizar Python es ejecutar tu
programa con el modulo profiler (mira la docu al respecto en la librería
estándar), ver que partes, funciones o métodos se comen la mayor parte
del tiempo de proceso (sección/secciones críticas) y aplicar algunas
optimizaciones sencillas a ellas, como por ejemplo hacer alias a nombres
de metodos, variables de clase o funciones de otros módulos en el
espacio de nombres local. Por ejemplo:

-------------------------------------------------------------------------------
def metodo_comecpu(self,tarari...):
	variable_que_se_usara_en_la_secc_critica = self.variable_que_se_usara_en_la_secc_critica
	metodo_q_se_usara_en_la_seccion_critica = self.metodo_q_s_usara_en_la_secc_critica
	func_q_s_usara_en_la_secc_critica = otromodulo.func_q_s_usara_en_la_secc_critica

	# Sección crítica aquí
	...
	# Fin de sección crítica
--------------------------------------------------------------------------------

Con esto yo he conseguido incrementos de velocidad del 100% y mayores en
mis programas, lo importante es saber donde se va el 90% de la CPU y
optimizar profundamente allí.

Aparte de eso, hay más opciones para optimizar partes del código muy
intensivas en CPU. Una (la más tradicional) es reescribir esa parte en C
o C++ y crear un módulo que pueda acceder a ese .objeto C o C++. Tiene
la desventaja de que te tienes que empollar el API de Python para C,
aunque de todas formas existen librerías que generan la interfaz a
Python de forma automática o simiautomática para C o C++. En mi opinión
la mejor, más potente y más fácil de usar es la libboost-python, aunque
sólo sirve para C++, pero realiza un mapeado casi casi directo entre las
clases y funciones C++ a clases y funciones C sin escribir prácticamente
código de interfaz, y luego los objetos C++ incluso puedes heredarse y
reescribirse algunos métodos desde Python (algo que creo que ninguna de
las otras soluciones permite).


Por último otra forma de combinar C con Python es utilizar el modulo
PyInline (sorry, ahora mismo no tengo la URL ni puedo mirarlo, mira en
Google) que te permite meter código C directamente dentro de código
Python y generar funciones en C que luego puedas utilizar normalmente
desde el resto del código Python. Esta solución me parece perfecta para
pequeños fragmentos de código que hay que optimizar mucho (funciones que
realizar cálculos matemáticos intensos o movidillas gráficas).

Saludos,
		Juanjo


 





Más información sobre la lista de distribución Python-es