ejecutar - ¿Convertir el programa Python a código C/C++?
python 3.6 online (8)
Si la variante C necesita x horas menos, invertiría ese tiempo en dejar que los algoritmos funcionen más tiempo / nuevamente
"invertir" no es la palabra correcta aquí.
Construya una implementación funcional en Python. Terminará esto mucho antes de que termine una versión C.
Mida el rendimiento con Python Profiler. Soluciona cualquier problema que encuentres. Cambie las estructuras de datos y los algoritmos según sea necesario para realmente hacer esto correctamente. Terminará esto mucho antes de que termine la primera versión en C.
Si todavía es demasiado lento, traduzca manualmente el Python bien diseñado y cuidadosamente construido a C.
Debido a la forma en que funciona la retrospectiva, hacer la segunda versión de Python existente (con las pruebas de unidad existentes y con los datos de generación de perfiles existentes) será aún más rápido que tratar de hacer el código C desde cero.
Esta cita es importante.
La regla de Thompson para quienes hacen 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
¿es posible convertir un programa de Python a C / C ++?
Necesito implementar un par de algoritmos, y no estoy seguro si la brecha de rendimiento es lo suficientemente grande como para justificar todo el dolor que sufriría al hacerlo en C / C ++ (que no soy bueno en). Pensé en escribir un algoritmo simple y compararlo con una solución así convertida. Si eso solo es significativamente más rápido que la versión de Python, entonces no tendré más remedio que hacerlo en C / C ++.
Acabo de encontrar this nueva herramienta en las noticias de los hackers.
Desde su página: "Nuitka es un buen sustituto para el intérprete de Python y compila todas las construcciones que ofrecen CPython 2.6, 2.7, 3.2 y 3.3. Traduce el Python en un programa C ++ que luego usa" libpython "para ejecutarse de la misma manera que CPython lo hace, de una manera muy compatible ".
Me doy cuenta de que falta una respuesta sobre una solución completamente nueva. Si se usa Numpy en el código, aconsejaría probar Pythran:
http://pythran.readthedocs.io/
Para las funciones que probé, Pythran da muy buenos resultados. Las funciones resultantes son tan rápidas como el código Fortran bien 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 en el 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 compilación justo a tiempo para los cuales (que yo sepa), usted 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 ...
Una desventaja de Pythran: ¡sin clases! Pero dado que solo deben compilarse las funciones que realmente deben optimizarse, no es muy molesto.
Otro punto: Pythran soporta bien (y muy fácilmente) el paralelismo OpenMP. Pero no creo que mpi4py sea compatible ...
Otra opción, convertir a C ++ además de Shed Skin , es Pythran .
Para citar High Performance Python por Micha Gorelick e Ian Ozsvald :
Pythran es un compilador de Python a C ++ para un subconjunto de Python que incluye
numpy
parcial connumpy
. Actúa un poco como Numba y Cython: usted anota los argumentos de una función, y luego toma el control con más anotación de tipo y especialización de código. Aprovecha las posibilidades de vectorización y las posibilidades de paralelización basadas en OpenMP. Se ejecuta solo con Python 2.7.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 convertir esto en código paralelo sin requerir un esfuerzo adicional de su parte. También puede especificar secciones paralelas usando las directivaspragma omp
>; a este respecto, se siente muy similar al soporte OpenMP de Cython.Detrás de escena, Pythran tomará el código normal de Python y numpy e intentará compilarlos 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 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.
Sé que este es un hilo más antiguo, pero quería dar lo que creo que es información útil.
Yo personalmente uso PyPy, que es muy fácil de instalar usando pip. Intercambiamos de forma intercambiable el intérprete Python / PyPy, no necesitas cambiar tu código y he descubierto que es aproximadamente 40 veces más rápido que el intérprete de Python estándar (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 enfocarte más en la tarea que en el idioma, lo cual es una gran ventaja para mí. Y si necesita que sea aún más rápido, siempre puede compilarlo en un binario para Windows, Linux o Mac. Según mi experiencia, obtuve una aceleración de aproximadamente 3.5x sobre PyPy al compilar, lo que significa que es 140 veces más rápido que Python. PyPy está disponible para Python 3x y 2x code y de nuevo si usas un IDE como PyCharm puedes intercambiar entre decir PyPy, Cython y Python muy fácilmente (aunque requiere un poco de aprendizaje inicial).
Algunas personas pueden discutir conmigo sobre esto, pero me parece que PyPy es más rápido que Cython. Sin embargo, ambos son excelentes opciones.
Editar: me gustaría hacer otra nota rápida sobre la compilación: cuando compila, el binario resultante es mucho más grande que su script de python, ya que genera todas las dependencias en él, etc. Pero luego obtiene unos beneficios distintos: ¡velocidad! ahora la aplicación funcionará en cualquier máquina (según el sistema operativo que hayas compilado, si no todo. lol) sin Python ni bibliotecas, también ofusca tu código y está listo técnicamente para la "producción". Algunos compiladores también generan código C, que realmente no he visto ni visto si es útil o simplemente un galimatías. Buena suerte.
Espero que ayude.
Sí. Mira Cython . Hace precisamente eso: convierte Python en C para acelerar.
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 en C / C ++ puro, que es mucho más rápido que C / C ++ plagado de llamadas a la API de Python. Nota: No lo he probado pero voy a ...
Shed Skin es "un compilador (restringido) de Python a C ++".