2011-01-10 19 views
90

¿es posible convertir un programa de Python a C/C++?¿Convertir el programa Python al código 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 pasaría al hacerlo en C/C++ (que no soy bueno a). 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++.

+24

Por mucho que Python pierda puntos de referencia, tenga en cuenta que esa ralentización de 50x o 100x sigue siendo negaba si el cálculo finaliza en unos pocos segundos en Python, y ni siquiera es verdadero cuando hace muchas E/S o tiene una horrible algoritmo. En lugar de preguntar "¿cuánto más lento es Python?" deberías preguntar "¿Python es lo suficientemente rápido?" (y lo más probable es que, honestamente) - eso también es más rápido que el benchmarking o preguntando aquí. – delnan

+1

Implementar un algoritmo en python es bastante rápido y directo ... simplemente tienes que hacerlo y luego verificar si es lo suficientemente rápido. La mayoría de las veces puede optimizar ** el algoritmo ** para que se ejecute mucho más rápido utilizando diferentes estructuras de datos (dict/sets en lugar de listas ...) o diferentes operaciones. De todos modos, debe ocurrir la optimización ** después de que ** ya haya implementado un primer borrador del algoritmo y lo haya evaluado/perfilado. – Bakuriu

+0

@delnan: en mi caso todo se trata del tiempo de cálculo. Si la variante C necesita x horas menos, invertiría ese tiempo en dejar que los algoritmos se ejecuten más tiempo/más. Simplemente quiero saber (más o menos) cuánto más lento sería Python; si solo son unas pocas horas, ciertamente no utilizaría un lenguaje con el que no me sienta cómodo (puede arruinar las mejores soluciones a los problemas con malas implementaciones: PAG). – CrazyFlyingCloseline

Respuesta

73

Sí. Mira Cython. Hace precisamente eso: convierte Python en C para acelerar.

+3

Por supuesto, eso no te ahorrará nada a menos que añadas un montón de declaraciones 'cdef' y, por lo tanto, introduzcas el tipado estático (de lo contrario, simplemente harás malabares con cosas' PyObject * 'opacas). Y nunca será tan rápido como la C simple porque usualmente interactúa con Python (100% o más) solo para código numérico simple que no se conecta con Python en absoluto durante el mayor tiempo posible. Pero aparte de eso, sí, puede conseguirte una aceleración bastante devent. – delnan

+4

@delnan: De hecho, te ahorra algo. La mayoría del código puro de Python será más rápido después de compilarse. Pero sí, con los cdefs y el tipado estático realmente comienzas a ver diferencias. Y la interfaz con Python se obtiene en todos los casos donde se usa C de Python. –

24

Shed Skin es "un compilador (restringido) de Python a C++".

+1

+1 una de las ventajas de Shed Skin es la * inferencia de tipo *: si es posible ir adivinando tipos de variables del flujo de programa, se evita la verificación dinámica de tipos. Esto generalmente conduce a un código C++ más corto que en realidad es posible leer y compilar a programas más rápidos. –

105

Si la variante C necesita x horas menos, entonces me gustaría invertir ese tiempo en dejar que los algoritmos se ejecutan más largo/más

"invertir" no es la palabra correcta aquí.

  1. Cree una implementación funcional en Python. Terminará esto mucho antes de que termine una versión C.

  2. Mide 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. Vas a terminar esto mucho antes de que termine la primera versión en C.

  3. Si sigue siendo demasiado lento, traducir manualmente el bien diseñado y construido cuidadosamente Python en C.

    Debido a las obras retrospectiva manera, hacer la segunda versión de Python existente (con las pruebas de unidad existentes, y con los datos de generación de perfiles existentes) seguirá siendo más rápido que tratar de hacer el código C desde cero.

Esta cita es importante.

Regla de Thompson por Primera Vez Telescopio Makers
Es más rápido para hacer un espejo de cuatro pulgadas y un espejo de seis pulgadas de hacer un espejo de seis pulgadas.

Bill McKeenan
Wang Instituto

3

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

8

Acabo de encontrar this nueva herramienta en noticias para 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 el Python en un programa C++ que luego usa" libpython "para ejecutar de la misma manera que CPython, de una manera muy compatible ".

+0

Este proyecto es mucho más maduro que otras opciones similares.Es curioso que crea el binario con una extensión '.exe' en OSX aunque es un ejecutable OSX Mach-O perfectamente normal. Parece que podría ser un buen reemplazo para 'pyinstaller',' py2exe', 'py2app', etc. Sin embargo, los indicadores' --recurse - *** 'son importantes para establecerlos correctamente. – ccpizza

2

Me doy cuenta de que falta una respuesta a una solución completamente nueva.Si Numpy se utiliza en el código, yo aconsejaría 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 ...

Un inconveniente de Pythran: no hay clases! Pero dado que solo deben compilarse las funciones que realmente deben optimizarse, no es muy molesto.

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

4

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

Para citar Alto Rendimiento del pitón de Micha Gorelick e Ian Ozsvald:

Pythran es un compilador de Python a C++ para un subconjunto de Python que incluye numpy apoyo parcial. Actúa un poco como Numba y Cython: usted anota los argumentos de una función, y luego toma el control con anotación de tipo adicional y especialización de código. Se necesitan ventajas de posibilidades de vectorización y posibilidades de paralelización basadas en OpenMP . Se ejecuta solo con Python 2.7.

Una característica muy interesante de Pythran es que se intentará oportunidades de paralelización automática del punto (por ejemplo, si estás usando un map), y convertir esto en código paralelo sin necesidad adicional esfuerzo de usted. También puede especificar secciones paralelas usando pragma omp> directivas; en este sentido, se siente muy similar al soporte OpenMP de Cython .

Detrás de las escenas, Pythran tomará tanto normal de Python y el código numpy e intentar compilar de forma agresiva en ellos muy rápido C++ - 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 amable y tienden a corregir errores en cuestión de horas.

2

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 ya que 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 se compila, el binario resultante es mucho más grande que su script en Python, ya que se basa en él todas las dependencias, etc, pero luego tienes unos pocos beneficios distintivos: ¡velocidad !, ahora la aplicación funcionará en cualquier máquina (dependiendo del sistema operativo para el que haya compilado, si no todo. lol) sin Python ni bibliotecas, también ofusca su 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.

Cuestiones relacionadas