cythonize python c optimization cython python-extensions

python - cythonize - cython pypi



Tutoriales sobre la optimización de aplicaciones Python no triviales con extensiones C o Cython (4)

Intentaré abordar sus puntos 1 y 2, y sus primeros 3 puntos, pero no en orden.

El tercer punto dice "asume que el algoritmo y el código de Python ya son óptimos". Cuando el código está en ese estado, si se toman muestras de pila ( como se describe aquí ), las muestras muestran exactamente lo que el programa está haciendo, desde una perspectiva temporal, y parece que no hay nada que pueda mejorarse sin un cambio de idioma. Sin embargo, ya que sabe cómo está gastando su tiempo, sabe qué algoritmo de bajo nivel (que podría consistir en más de una función, no solo en un punto de acceso) podría beneficiarse al hacerse menos tiempo, es decir, al convertirse a C .

Con respecto al punto 1, este método muestra qué partes del código se beneficiarán con la conversión a C, y pueden o no ser puntos de acceso. (Lo primero que me viene a la mente es cualquier tipo de función recursiva o conjunto de funciones. O, un pequeño grupo de funciones que en conjunto cumplen algún propósito, como un escalador de colinas).

Con respecto al punto 2, cualquier código que no aparezca en un porcentaje saludable de las muestras de pila, o que lo haga, pero claramente no se beneficiará al convertirse a C, como I / O.

Con respecto al primer y segundo punto, estoy de acuerdo en que medir no es el objetivo principal, sino un subproducto del proceso de encontrar el código para optimizar. Presentar tales medidas también está al lado del punto.

He estado en situaciones similares, excepto no entre python y C, sino entre C y hardware. **

Solo para dar un ejemplo, si el tiempo total de ejecución es de 10 segundos, y el algoritmo está en la pila aproximadamente el 50% del tiempo, entonces es responsable de aproximadamente 5 de los 10 segundos. Si convertir el algoritmo a C daría una aceleración de 10x, entonces esos 5 segundos se reducirían a 0,5 segundos, por lo que el tiempo total se reduciría a 5,5 segundos. (Aproximadamente, es más importante lograr la reducción de tiempo que saber de antemano qué tan grande será). Tenga en cuenta que, en este punto, todo el proceso podría repetirse, y podría tener sentido convertir otra cosa a C también. Puedes detener este proceso cuando las muestras muestren que el código de Python está haciendo lo que es bueno y el código C está haciendo lo que es bueno.

** Por ejemplo, matemática de punto flotante, biblioteca vs. chip o gráficos, dibujo de texto y polígonos.

La comunidad de Python ha publicado un material de referencia útil que muestra cómo perfilar el código de Python y los detalles técnicos de las extensiones de Python en C o en Cython . Todavía estoy buscando tutoriales que muestren, sin embargo, programas no triviales de Python, lo siguiente:

  1. Cómo identificar los hotspots que se beneficiarán de la optimización mediante la conversión a una extensión C
  2. Igual de importante, cómo identificar los puntos de acceso que no se beneficiarán de la conversión a una extensión C
  3. Finalmente, cómo hacer la conversión apropiada de Python a C, ya sea utilizando la API C de Python o (quizás incluso preferiblemente) usando Cython.

Un buen tutorial proporcionaría al lector una metodología sobre cómo razonar a través del problema de la optimización trabajando a través de un ejemplo completo. No he tenido éxito en encontrar tal recurso.

¿Conoces (o has escrito) este tutorial?

Para aclarar, no estoy interesado en tutoriales que cubran solo lo siguiente:

  • Uso de (c) Perfil para perfilar el código Python para medir los tiempos de ejecución
  • Usando herramientas para examinar perfiles (recomiendo RunSnakeRun )
  • Optimización seleccionando algoritmos más apropiados o construcciones de Python (por ejemplo, conjuntos para pruebas de membresía en lugar de listas); el tutorial debe asumir que el algoritmo y el código de Python ya son óptimos, y estamos en un punto donde una extensión C es el siguiente paso lógico
  • Recapitulando la documentación de Python sobre la escritura de extensiones C , que ya es excelente como referencia, pero no es un recurso útil para mostrar cuándo y cómo pasar de Python a C.

Los puntos 1 y 2 son solo una regla básica de optimización de los pulgares. Me sorprendería mucho si hubiera en algún lugar el tipo de tutorial que está buscando. Tal vez por eso no has encontrado uno. Mi lista corta:

  • La regla número uno de optimización es no hacerlo .
  • regla número dos medida
  • la regla número tres identifica el factor limitante (si está enlazado a IO o a la base de datos, no se puede alcanzar ninguna optimización de todos modos).
  • la regla número cuatro es pensar , usar mejores algoritmos y estructura de datos ...
  • considerando un cambio de idioma es bastante bajo en la lista ...

Simplemente comienza perfilando tu código de python con las herramientas habituales de python . Encuentra donde tu código necesita ser optimizado. Luego trata de optimizarlo pegándose con python. Si todavía es demasiado lento, trate de entender por qué. Si está enlazado a IO es poco probable que un programa C sea mejor. Si el problema proviene del algoritmo, también es poco probable que C se desempeñe mejor. Realmente los casos "buenos" en los que C podría ayudar son bastante raros, el tiempo de ejecución no debe estar muy lejos de lo que quiere (como una aceleración de 2 de 3 veces) la estructura de datos es simple y se beneficiaría de una representación de bajo nivel y realmente, Realmente necesito esa aceleración. En la mayoría de los otros casos, usar C en lugar de python será un trabajo sin recompensa.

Realmente es bastante raro que el código C de python se haga con el rendimiento en mente como objetivo principal. Más a menudo, el objetivo es interconectar Python con algún código C existente.

Y como dijo otro póster, probablemente te aconsejen mejor que uses cython.

Si aún desea escribir un módulo C para Python, todo lo necesario está en la documentación oficial.


Para los puntos 1 y 2, usaría un generador de perfiles de Python, por ejemplo, cProfile . Vea here para un tutorial rápido.

Si ya tienes un programa de Python, para el punto 3 es posible que desees utilizar Cython . Por supuesto, en lugar de volver a escribir en C, puede pensar en una mejora algorítmica que aumentará la velocidad de ejecución.


O''Reilly tiene un tutorial (disponible libremente, por lo que puedo decir, pude leerlo todo) que ilustra cómo crear un perfil de un proyecto real (utilizan un proyecto de análisis EDI como tema para la creación de perfiles) e identifican puntos de acceso. No hay demasiados detalles sobre cómo escribir la extensión C que solucionará el cuello de botella en el artículo de O''Reilly. Sin embargo, cubre las dos primeras cosas que desea con un ejemplo no trivial.

El proceso de escribir extensiones C está bastante bien documentado here . La parte difícil es encontrar formas de replicar lo que el código de Python está haciendo en C, y eso requiere algo que sería difícil de enseñar en un tutorial: ingenio, conocimiento de algoritmos, hardware, eficiencia y considerable habilidad en C.

Espero que esto ayude.