¿Por qué las personas incrustan / envuelven código python en C / C ++?

Uso necesario de bibliotecas solo disponibles en Python.

Recientemente tuve que implementar una incrustación de Python en C ++. Tuve un gran proyecto de investigación usando scikit-learn. Se compone de dos componentes; uno consumió una transmisión de datos en vivo para entrenar y administrar una serie de modelos predictivos (clasificadores), que se serializaron y almacenaron como archivos en el disco. Desarrollamos nuestro propio tipo de archivo para admitir versiones e incrustación de metadatos; El segundo componente era un servidor REST en línea que ofrecía predicciones en tiempo real. Cargaría los modelos desde el disco, capturaría previamente según fuera necesario y ejecutaría múltiples predicciones por solicitud. Los resultados se ordenaron, recortaron y serializaron en JSON.

El proyecto completo se implementó en Python y dependía en gran medida de scikit-learn. Rápidamente se hizo evidente que el servidor basado en Python no podía cumplir con nuestros requisitos de rendimiento; migrar a una implementación de C ++ se convirtió en la única opción.

Sin embargo, después de 6 meses en el proyecto, tuve que entregar lo antes posible; migrar a una biblioteca de C ++ no era factible en el tiempo. Requeriría no solo reescribir el código completo, sino también volver a evaluar la nueva biblioteca desde cero; afina los parámetros de entrenamiento y reescribe desde cero un protocolo de serialización y un tipo de archivo modelo.

Finalmente elegí incrustar Python en un servidor basado en C ++; la parte de C ++ haría casi todo (todo el procesamiento de solicitudes, datos y resultados) mientras que la parte de Python tenía solo 30 líneas para ejecutar una predicción (y configurar el entorno).

La implementación híbrida final empleó multiprocesamiento para evitar las deficiencias del paralelismo GIL; terminó siendo (10 * CPU #) veces más rápido que la versión solo para Python y se escala superlinealmente debido al costo fijo de procesamiento previo y posterior, independientemente del tamaño de entrada.

El proceso de migración duró 3 semanas y cumplí el plazo con bastante facilidad.

Noté que preguntaste sobre envolver Python en C ++, no al revés.

La razón habitual para esto es que está creando una gran aplicación C ++, y desea que los usuarios puedan escribir algunas de sus funciones. Una forma de hacerlo es incrustar un intérprete de Python y exponer una API para controlar la aplicación más grande.

Diré que si tengo que hacerlo yo mismo, generalmente elegiría Lua antes que Python, ya que la API para el intérprete de Lua es mucho más fácil de usar.

Pero también se hace con bastante frecuencia con Python; Una de las razones es que es posible que desee combinar algún conjunto de bibliotecas disponibles en Python con las características de la aplicación C ++.

QGIS es un ejemplo bastante impresionante de una aplicación que hace esto; Se puede escribir un complemento QGIS en Python, y muchos de esos complementos utilizan bibliotecas numpy, scipy y gráficos como matplotlib para proporcionar análisis de datos de mapas, que se les proporciona mediante el código C ++ que forma la interfaz de usuario y las interfaces a las bases de datos.

Configuración flexible y herramientas programables por el usuario. Aprovechar la base de código de Python y el recurso compartido mental es mejor para el costo de desarrollo y la experiencia del usuario que crear un lenguaje específico de dominio.

Por ejemplo, compare la funcionalidad presente en el lenguaje interno gdb con python. Su sistema de tipo deficiente y la falta de facilidades de coincidencia, como expresiones regulares, limitan las búsquedas de datos, especialmente cuando se observan volcados del núcleo de programas inactivos donde no se pueden llamar las funciones ‘C’. La falta de variables locales impide la recursividad para volcar árboles. Obviamente, la sintaxis es diferente de cualquier otro lenguaje que los desarrolladores usan regularmente.

Hace 15–25 años usamos TCL cuando necesitábamos un lenguaje integrado que pudiera acceder a los datos en un programa principal C o C ++, aunque hoy Python es una mejor opción debido a la funcionalidad incorporada, el soporte de terceros y cuán común es su uso es por desarrolladores de software,

Python es divertido y fácil de usar, pero no es muy rápido. Incrustar C ++ en el código de Python le permite a C ++ abordar los bits de alto rendimiento, en lo que C ++ es bueno, y le permite a Python manejar las otras cosas, en lo que Python es bueno.

Muchas bibliotecas están escritas en C o C ++. Poner un contenedor de Python alrededor de C ++ es más fácil y menos propenso a errores que reescribir la biblioteca en Python.

En teoría (y en la práctica) obtendría un mejor rendimiento al escribir la misma característica en C o C ++.

En la práctica, si tiene prisa por cumplir con una función que no es un impuesto al rendimiento, entonces puede tener sentido integrar el código de Python (u otro script) en su proyecto para optimizar el tiempo de desarrollo en diferencias de tiempo de ejecución insignificantes. Cuando no está en un ciclo cerrado, generalmente puede permitirse un orden de magnitud en el rendimiento del tiempo de ejecución sin problemas. Si hay un problema con esa sobrecarga, siempre puede retroceder y optimizar mejor y permitirse el tiempo de desarrollador según sea necesario.

Tiene una buena integración con muchos lenguajes de programación y también usa ctypes, es fácil de integrar con C. Si alguien ejecuta un sistema heredado en C y desea desarrollar cualquier módulo periférico que rodee ese programa heredado, entonces va a envolverlo.

Porque algunas tareas son más fáciles de hacer en Python.

Python para muchas tareas es mucho más fácil y rápido en comparación con otros lenguajes, por lo que si hay muchas tareas que necesitan hacer y quieren hacerlo rápidamente, tiene sentido que usen Python.

Una posibilidad es que quieran usar una biblioteca Python de un programa C ++.

More Interesting

Con referencia a AdaBoost, ¿qué se entiende exactamente por 'ponderado' cuando se dice que entrena a un clasificador débil dada una distribución ponderada?

¿Cómo podemos hacer un análisis de opinión para una revisión de película cuando no tenemos un conjunto de datos de capacitación?

¿Qué son las redes neuronales, redes neuronales artificiales y redes neuronales convolucionales? ¿Cómo son diferentes el uno del otro?

Cómo construir la matriz del núcleo para un polinomio de grado finito

¿Dónde están los temas interesantes que se cruzan con la neurociencia y el aprendizaje automático?

Cómo construir una consulta a partir de una pregunta de lenguaje natural en Python

¿Por qué es difícil entrenar un modelo de aprendizaje automático de forma incremental, en tiempo real?

¿Qué ha aprendido sobre el aprendizaje automático, la recuperación de información y la minería de datos después de unirse a una empresa de Internet que se ocupa de big data?

¿Qué herramientas, algoritmos o estructuras de datos usaría para construir un algoritmo de "Temas de tendencias" para una transmisión de alta velocidad?

¿Qué datos puedo recopilar y hacer un procesamiento de Big Data para diagnosticar en mis sistemas?

¿Por qué el aprendizaje automático, las redes neuronales y otros enfoques de IA, por ejemplo, no se usan más ampliamente en las predicciones del mercado de valores?

¿Existe algún audiolibro 'técnico' realmente bueno para la investigación de operaciones o el aprendizaje automático, aparte del algoritmo maestro?

¿Por qué tenemos que convertir el valor categórico en factor (en R) o variables ficticias antes de aplicar algoritmos de aprendizaje automático (especialmente regresión lineal)? ¿Afecta nuestros resultados?

¿Cuáles son las mejores empresas de minería de datos?

¿Por qué el error cuadrático medio es equivalente a minimizar la entropía cruzada entre la distribución empírica y un modelo gaussiano?