2010-04-15 8 views
6

Me estoy divirtiendo mucho aprendiendo Python escribiendo un tipo de aplicación de programación genética.Necesito acelerar una función. ¿Debería usar cython, ctypes o algo más?

He recibido buenos consejos de Torsten Marek, Paul Hankin y Alex Martelli en este sitio.

el programa tiene 4 funciones principales:

  • generan (al azar) un árbol de expresión.
  • evaluar la idoneidad del árbol
  • cruce
  • mutan

Como todos generar, híbrido y mutar llaman 'evaluar la aptitud'. es la función más ocupada y es el principal cuello de botella en el sentido de la velocidad.

Como es la naturaleza de los algoritmos genéticos, tiene que buscar en un espacio de solución inmenso para que cuanto más rápido mejor. Quiero acelerar cada una de estas funciones. Comenzaré con el evaluador de estado físico. Mi pregunta es cuál es la mejor manera de hacer esto. He estado investigando cython, ctypes y 'linking and embedded'. Todos son nuevos para mí y bastante más allá de mí en este momento, pero espero aprender uno y eventualmente todos.

La 'función de aptitud' necesita comparar el valor del árbol de expresión con el valor de la expresión de destino. Por lo tanto, consistirá en un evaluador de postfijo que leerá el árbol en una orden postfix. Tengo todo el código en Python.

Necesito consejos que debo aprender y usar ahora: cython, ctypes o linking e incrustación.

Gracias.

Respuesta

11

Ignora la respuesta de todos los demás por el momento. Lo primero que debes aprender a usar es el generador de perfiles. Python viene con un perfil/cProfile; debe aprender a leer los resultados y analizar dónde están los cuellos de botella reales. El objetivo de la optimización es triple: reduzca el tiempo dedicado a cada llamada, reduzca el número de llamadas que se realizarán y reduzca el uso de la memoria para reducir la vibración del disco.

El primer objetivo es relativamente fácil. El generador de perfiles le mostrará las funciones que consumen más tiempo y puede ir directamente a esa función para optimizarlo.

El segundo y tercer objetivo es más difícil ya que esto significa que debe cambiar el algoritmo para reducir la necesidad de hacer tantas llamadas. Encuentre las funciones que tienen una gran cantidad de llamadas y trate de encontrar maneras de reducir la necesidad de llamarlas. Utiliza las colecciones integradas, están muy bien optimizadas.

Si ha hecho todo lo anterior y todavía tiene problemas de rendimiento y está en una plataforma x86 (básicamente la mayoría de CPU), entonces comience a mirar a Psyco. Psyco puede optimizar un código de Python con la necesidad de cambiar el código de su pitón.

Si está realizando un gran número de procesadores numéricos y de matriz, debe echar un vistazo a los módulos de Numpy/Scipy y gmpy de terceros.

Siguiente para probar es Cython. Cython es un lenguaje ligeramente diferente de Python, de hecho, Cython es en realidad C con la sintaxis de Python.

Para partes de su código que están en bucles muy estrechos que ya no puede optimizar usando otras formas, puede reescribirlo como extensión C. Python tiene un soporte muy bueno para extenderse con C.

+3

Cuando utilizas el perfil de python o cProfile, una cosa que encuentro realmente conveniente y útil es una herramienta de visualización que me permite ver los números graficados. Mi favorito es RunSnakeRun. Requiere wxPython y algunas otras dependencias. Al ejecutarlo en su salida cProfile se genera una GUI squaremap-thingy, donde cada función se dibuja como un rectángulo, se mide por el tiempo (medio o acumulativo) tomado dentro de esa función y se incluyen rects para las funciones que llama. Hace que entender la salida del generador de perfiles sea muy sencillo. –

0

Otra gran opción es boost :: python que le permite ajustar fácilmente C o C++.

Sin embargo, de estas posibilidades, ya que tiene el código python ya escrito, es probable que probar primero sea cython. Tal vez no tenga que volver a escribir ningún código para obtener una aceleración.

+0

Sí, he oído hablar de eso. Significa que tendré que aprender suficiente c para escribir las funciones en él, lo cual es probablemente una buena idea. –

3

Cython es la forma más rápida de hacer el trabajo, ya sea escribiendo su algoritmo directamente en Cython, o escribiéndolo en C y enlazándolo a Python con Cython.

Mi consejo: aprenda Cython.

+0

cython me atrajo más a mí, pero ¿sería el más rápido? –

0

Trate de trabajar su función de acondicionamiento físico para que admita la memorización. Esto reemplazará todas las llamadas duplicadas de llamadas anteriores con una búsqueda rápida de dict.

Cuestiones relacionadas