¿Es posible convertir un programa 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 pasaría al hacerlo en C / C ++ (en lo que no soy bueno). Pensé en escribir un algoritmo simple y compararlo con una solución 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 ++.
c++
python
c
code-generation
CrazyFlyingCloseline
fuente
fuente
Respuestas:
Si. Mira a Cython . Hace exactamente eso: Convierte Python a C para acelerar.
fuente
cdef
declaraciones y, por lo tanto, introduzca una escritura estática (de lo contrario, solo hará malabarismos conPyObject *
cosas opacas ). Y nunca será tan rápido como el C simple porque usualmente interactúa con Python (¿100% o más? ¡Solo para un código numérico simple que no interactúa con Python en la mayor parte del tiempo!). Pero aparte de eso, sí, puede obtener una aceleración bastante ingeniosa."invertir" no es la palabra correcta aquí.
Construya una implementación funcional en Python. Terminarás esto mucho antes de terminar una versión C.
Mida el rendimiento con el generador de perfiles de Python. Solucione cualquier problema que encuentre. Cambie las estructuras de datos y los algoritmos según sea necesario para realmente hacer esto correctamente. Terminarás esto mucho antes de terminar 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 unitarias existentes y con los datos de perfiles existentes) seguirá siendo más rápido que intentar hacer el código C desde cero.
Esta cita es importante.
fuente
Shed Skin es "un compilador de Python a C ++ (restringido)".
fuente
Acabo de encontrar esta nueva herramienta en las noticias de hackers.
Desde su página: "Nuitka es un buen reemplazo para el intérprete de Python y compila cada construcción que ofrecen CPython 2.6, 2.7, 3.2 y 3.3. Traduce Python en un programa C ++ que luego utiliza" libpython "para ejecutar de la misma manera que CPython lo hace, de una manera muy compatible ".
fuente
.exe
extensión en OSX a pesar de que es un ejecutable perfectamente normal OSX Mach-O. Parece que podría ser un buen reemplazo parapyinstaller
,py2exe
,py2app
, etc. Las--recurse-***
banderas son importantes para configurar correctamente sin embargo.Otra opción, para convertir a C ++ además de Shed Skin , es Pythran .
Para citar Python de alto rendimiento de Micha Gorelick e Ian Ozsvald :
fuente
Sé que este es un hilo 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. Uso indistintamente el intérprete de Python / PyPy, no necesita cambiar su código en absoluto y he descubierto que es aproximadamente 40 veces más rápido que el intérprete de Python estándar (Python 2x o 3x). Uso pyCharm Community Edition para administrar mi código y me encanta.
Me gusta escribir código en Python, ya que creo que te permite concentrarte más en la tarea que en el lenguaje, lo cual es una gran ventaja para mí. Y si necesita que sea aún más rápido, siempre puede compilar en un binario para Windows, Linux o Mac (no sencillo pero posible con otras herramientas). Según mi experiencia, obtengo una aceleración de 3.5x sobre PyPy al compilar, lo que significa 140x más rápido que Python. PyPy está disponible para código Python 3x y 2x y, de nuevo, si usa un IDE como PyCharm, puede intercambiar entre PyPy, Cython y Python muy fácilmente (aunque requiere un poco de aprendizaje inicial y configuración).
Algunas personas pueden discutir conmigo sobre esto, pero creo que PyPy es más rápido que Cython. Pero ambas 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 crea todas las dependencias en él, etc. Pero luego obtiene algunos beneficios distintos: ¡velocidad! ahora la aplicación funcionará en cualquier máquina (dependiendo del sistema operativo para el que compiló, si no todos. lol) sin Python o bibliotecas, también ofusca su código y está técnicamente listo para la 'producción' (hasta cierto punto). Algunos compiladores también generan código C, que realmente no he visto ni visto si es útil o simplemente galimatías. Buena suerte.
Espero que ayude.
fuente
Me doy cuenta de que falta una respuesta sobre una solución bastante nueva. Si se usa Numpy en el código, recomendarí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 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 comprender las operaciones
numpy.ndarray
.También es una gran ventaja en comparación con Numba u otros proyectos basados en la compilación justo a tiempo para los cuales (que yo sepa), debe expandir los bucles para ser realmente eficiente. Y luego el código con los bucles se vuelve muy ineficiente usando solo CPython y Numpy ...
Un inconveniente de Pythran: ¡no hay clases! Pero como solo se deben compilar las funciones que realmente necesitan ser optimizadas, no es muy molesto.
Otro punto: Pythran admite bien (y muy fácilmente) el paralelismo de OpenMP. Pero no creo que mpi4py sea compatible ...
fuente
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 a la API de Python. Nota: No lo he probado pero voy a ...
fuente