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