2011-12-30 7 views
9

Estoy desarrollando una aplicación C++ que se puede extender/escribir con Python. Por supuesto, C++ es mucho más rápido que Python, en general, pero ¿eso significa necesariamente que debería preferir ejecutar código C++ sobre código Python tan a menudo como sea posible?Precio del control de conmutación entre C++ y Python

Pregunto esto porque no estoy seguro, ¿hay algún costo de rendimiento de cambiar el control entre el código escrito en C++ y el código escrito en Python? ¿Debería usar código escrito en C++ en cada ocasión, o debería evitar volver a llamar a C++ para tareas simples porque cualquier ganancia de velocidad que pueda tener al ejecutar código C++ es superada por el costo de cambiar de idioma?

Editar: Debo dejar esto en claro, no estoy pidiendo esto para resolver un problema. Lo pido puramente por curiosidad y es algo que vale la pena tener en cuenta para el futuro. Entonces no estoy interesado en soluciones alternativas, solo quiero saber la respuesta, desde un punto de vista técnico. :)

+0

¿Es una opción escribir la aplicación principal en Python, y usar C++ para escribir un módulo de Python que su aplicación pueda usar? Entonces el costo de cambiar idiomas debería ser cero. –

Respuesta

1

El costo está presente pero es insignificante. Esto se debe a que probablemente trabaje bastante para convertir los tipos de datos de alto nivel de python en representaciones compatibles con C++. Por supuesto, esto es similar al costo de llamar a una función de C++ desde otra, hay algunos gastos generales. Las reglas para cuando es una buena idea para cambiar de pitón a C++ son:

Una función con pocos argumentos

A, la cual realiza una gran cantidad de procesamiento en una pequeña cantidad de datos

Una función que se llama lo menos posible - la función de consolidar las llamadas si es posible

+1

En orden: 1. ¿Qué tiene que ver el número de argumentos con algo? 2. ¿Qué pasa con una gran cantidad de procesamiento en una * gran * cantidad de datos? ¿No puede C++ hacer eso? 3: Si rara vez se llama, ¿por qué pasar por el tremendo esfuerzo de convertirlo a C++? Parece que deberías concentrarte en los que realmente consumen tiempo de procesamiento. –

+1

@Chris: 1. Como dice Dan, generalmente es bastante torpe acceder a los argumentos de un intérprete. Si necesitabas una función que tomara un centenar de argumentos numéricos solo para devolver su suma, no tendría mucho sentido recurrir a una implementación de C++. El mismo concepto guía "gran ... procesamiento ... pequeño ... datos" - si puede pasar el código C++ menos argumentos (incluso si son grandes conjuntos) y está haciendo algo complejo como decir reconocimiento óptico de caracteres en los datos , entonces es muy probable que valga la pena implementar/llamar en C++. –

+1

@Chris: 3. "tan raramente como _possible_" - diga cada uno de los miles de millones de pases a través de un ciclo cerrado necesario para aplicar alguna función matemática extraña y compleja a 20 valores. Considere la posibilidad de consolidar las llamadas de C++, de modo que una llamada a C++ recibe los 20 valores a la vez, y devuelve los resultados juntos. –

0

La mejor métrica debe ser algo que wieghs para usted ....

  • hace que el desarrollo, depuración y pruebas más fácil (reduce el coste dev)
  • reduce el costo de mantenimiento
  • cumple con el requisito de rendimiento (proporciona la solución)
7

no sé que hay una regla concreta para esto, pero una regla general que muchos siguen es:

  • Prototipo en python. Esto es más rápido de escribir, y puede ser más fácil de leer/razonar.
  • Una vez que tenga un prototipo, ahora puede identificar las partes lentas que se deben escribir en C++ (a través del perfilado).
  • Dependiendo del dominio de su código, los bits lentos generalmente se aíslan a los tipos de código 'bucle interno', por lo que el número de conmutadores entre python y este código debería ser relativamente pequeño.
  • Si su programa es lo suficientemente rápido, ha evitado prematuramente optimizar su código escribiendo demasiado en C++.
+1

Esto es claramente parcial, como si cada aplicación estuviera mejor escrita en Python. Python no escala (en líneas de código o rendimiento o manejo de datos) de la forma en que C++ lo hace y no es adecuado para muchos de los usos a los que se aplica C++. La pregunta sugiere un programa existente de C++ que necesita alguna interpretación en tiempo de ejecución para la personalización. "más rápido para escribir, más fácil de leer/razonar" es una tontería: con Python es más fácil encontrar bibliotecas para comenzar en problemas de clase "todavía-otro-" más rápido, pero un entorno C++ maduro con bibliotecas personalizadas para el trabajo puede ser mejor de nuevo –

+0

@Tony, la legibilidad en general es subjetiva (es por eso que dije que no hay una regla concreta), y estoy seguro de que (python) no es correcta para todos los dominios de problema. Para las cosas en las que he trabajado, sin embargo, se ha escalado muy bien en términos de LOC y expresividad. Una última nota sobre el sesgo ... la mayoría de las cosas de c/C++ que miro son muy difíciles de leer para mí, pero eso es probablemente porque soy un tipo pitón. Tu perfil dice que eres mucho un chico de C++, eso explicaría tu opinión. –

+0

Además, esta pregunta es pedir una respuesta parcial, ya que nadie (sin ver su programa exacto) puede decir con certeza la * mejor * opción para él. –

2

Manténgalo simple y ajuste el rendimiento según sea necesario. La razón principal para incrustar un intérprete en una aplicación C++ es permitir que la configuración/datos en tiempo de ejecución especifiquen algún procesamiento, es decir, puede modificar el guión sin volver a compilar el programa C++, esa es su guía para saber cuándo llamar al intérprete.Una vez en algunos llaman intérprete, las principales razones para llamar de nuevo en C++ son:

  • para acceder o actualizar algunos datos que no pueden razonablemente ser expuesto como un parámetro de la llamada (o por medio de algún otro proceso de registro del intérprete admite)
  • para conseguir un mejor rendimiento durante una parte crítica del procesamiento

en este último caso, tratar el guión primero (asumiendo que es tan fácil de desarrollar allí), a continuación, si se identifican lenta dónde y cómo algunos de C++ el código podría ayudar. Si/dónde el rendimiento es un problema, como una guía general cuando se llama desde C++ al intérprete o viceversa: intente alinear todo el trabajo posible y luego realice la llamada al otro sistema. Si te quedas atascado, vuelve a stackoverflow con un problema específico y un código real.

Cuestiones relacionadas