¿Convertir el progtwig Python a código C / C ++?

¿Es posible convertir un progtwig Python a C / C ++?

Necesito implementar un par de algoritmos, y no estoy seguro de si la brecha de rendimiento es lo suficientemente grande como para justificar todo el dolor que atravesaría al hacerlo en C / C ++ (en el que no soy bueno). Pensé en escribir un algoritmo simple y compararlo con una solución tan convertida. Si solo eso es significativamente más rápido que la versión de Python, entonces no tendré otra opción que hacerlo en C / C ++.

Sí. Mira a Cython . Hace exactamente eso: Convierte Python a C para boost la velocidad.

Si la variante de C necesita x horas menos, invertiría ese tiempo en dejar que los algoritmos se ejecuten más tiempo / nuevamente

“invertir” no es la palabra correcta aquí.

  1. Construir una implementación de trabajo en Python. Terminarás esto mucho antes de terminar una versión C.

  2. Medir el rendimiento con el perfilador de Python. Soluciona cualquier problema que encuentres. Cambie las estructuras de datos y los algoritmos según sea necesario para hacerlo realmente correctamente. Terminarás esto mucho antes de terminar la primera versión en C.

  3. Si aún es demasiado lento, traduzca manualmente el Python bien diseñado y cuidadosamente construido a C.

    Debido a la forma en que funciona la visión retrospectiva, hacer la segunda versión desde Python existente (con pruebas unitarias existentes y con datos de perfiles existentes) aún será más rápido que intentar hacer el código C desde cero.

Esta cita es importante.

Regla de Thompson para los fabricantes de telescopios por primera vez
Es más rápido hacer un espejo de cuatro pulgadas y luego un espejo de seis pulgadas que hacer un espejo de seis pulgadas.

Bill McKeenan
Instituto Wang

Shed Skin es “un comstackdor de Python a C ++ (restringido)”.

Acabo de encontrar esta nueva herramienta en noticias de hackers.

Desde su página: “Nuitka es un buen reemplazo para el intérprete de Python y comstack cada construcción que ofrecen CPython 2.6, 2.7, 3.2 y 3.3. Convierte Python en un progtwig C ++ que luego usa” libpython “para ejecutarse de la misma manera que CPython lo hace, de una manera muy compatible “.

Otra opción – para convertir a C ++ además de Shed Skin – es Pythran .

Para citar High Performance Python de Micha Gorelick e Ian Ozsvald :

Pythran es un comstackdor de Python a C ++ para un subconjunto de Python que incluye compatibilidad con numpy parciales. Se comporta un poco como Numba y Cython: usted anota los argumentos de una función, y luego se encarga de la anotación de tipos y la especialización de código. Aprovecha las posibilidades de vectorización y las posibilidades de paralelización basadas en OpenMP. Se ejecuta utilizando Python 2.7 solamente.

Una característica muy interesante de Pythran es que intentará detectar automáticamente las oportunidades de paralelización (por ejemplo, si está utilizando un map ) y convertirlo en un código paralelo sin requerir un esfuerzo adicional por su parte. También puede especificar secciones paralelas usando las directivas pragma omp >; en este sentido, se siente muy similar al soporte OpenMP de Cython.

Detrás de las escenas, Pythran tomará el código normal y el código de Python e intentará comstackrlos agresivamente en C ++ muy rápido, incluso más rápido que los resultados de Cython.

Debe tener en cuenta que este proyecto es joven y que puede encontrar errores; También debe tener en cuenta que el equipo de desarrollo es muy amigable y tiende a corregir errores en cuestión de horas.

http://code.google.com/p/py2c/ parece una posibilidad, también mencionan en su sitio: Cython, Shedskin y RPython y confirman que están convirtiendo el código Python a C / C ++ puro, que es mucho más rápido que C / C ++ plagado de llamadas API de Python. Nota: no lo he probado pero voy a …

Sé que este es un tema más antiguo pero quería dar lo que creo que es información útil.

Personalmente uso PyPy, que es realmente fácil de instalar usando pip. Yo uso indistintamente el intérprete de Python / PyPy, no es necesario que cambies el código en absoluto y he encontrado que es aproximadamente 40 veces más rápido que el intérprete de Python estándar (ya sea Python 2x o 3x). Utilizo pyCharm Community Edition para administrar mi código y me encanta.

Me gusta escribir código en python porque creo que te permite concentrarte más en la tarea que en el lenguaje, lo que es una gran ventaja para mí. Y si necesita que sea aún más rápido, siempre puede comstackrlo en un binario para Windows, Linux o Mac. Desde mi experiencia, obtengo una aceleración de aproximadamente 3.5x sobre PyPy al comstackr, lo que significa 140 veces más rápido que python. PyPy está disponible para los códigos Python 3x y 2x y nuevamente, si usa un IDE como PyCharm, puede intercambiar entre PyPy, Cython y Python muy fácilmente (aunque toma un poco de aprendizaje inicial).

Algunas personas pueden discutir conmigo sobre esto, pero creo que PyPy es más rápido que Cython. Sin embargo, ambos son grandes elecciones.

Edición: Me gustaría hacer otra nota rápida sobre la comstackción: cuando comstacks, el binario resultante es mucho más grande que tu script de Python, ya que genera todas las dependencias en él, etc. Pero luego obtienes algunos beneficios distintos: ¡velocidad! ahora la aplicación funcionará en cualquier máquina (según el sistema operativo que compiló para, si no todos. lol) sin Python o bibliotecas, también confunde su código y está técnicamente listo para la “producción”. Algunos comstackdores también generan código C, que realmente no he visto ni visto si es útil o simplemente incomprensible. Buena suerte.

Espero que ayude.

Me doy cuenta de que falta una respuesta a una solución bastante nueva. Si se usa Numpy en el código, aconsejaría probar Pythran:

http://pythran.readthedocs.io/

Para las funciones que probé, Pythran da resultados extremadamente buenos. Las funciones resultantes son tan rápidas como el código Fortran escrito (o solo un poco más lento) y un poco más rápido que la solución Cython (bastante optimizada).

La ventaja en comparación con Cython es que solo tiene que usar Pythran en la función Python optimizada para Numpy, lo que significa que no tiene que expandir los bucles y agregar tipos para todas las variables del bucle. Pythran se toma su tiempo para analizar el código para que entienda las operaciones en numpy.ndarray .

También es una gran ventaja en comparación con Numba u otros proyectos basados ​​en comstackción justo a tiempo para los cuales (según mi conocimiento), tiene que expandir los bucles para ser realmente eficiente. Y luego el código con los bucles se vuelve muy muy ineficiente usando solo CPython y Numpy …

Un inconveniente de Pythran: no hay clases! Pero como solo se deben comstackr las funciones que realmente necesitan optimizarse, no es muy molesto.

Otro punto: Pythran soporta bien (y muy fácilmente) el paralelismo OpenMP. Pero no creo que mpi4py sea compatible …