¿Hay ventajas de usar la interfaz Python/C en lugar de Cython?


Quiero extender python y numpy escribiendo algunos módulos en C o C++, usando BLAS y LAPACK. También quiero poder distribuir el código como bibliotecas independientes de C/C++. Me gustaría que estas bibliotecas utilicen flotador de precisión simple y doble. Algunos ejemplos de funciones que escribiré son gradiente conjugado para resolver sistemas lineales o métodos acelerados de primer orden. Algunas funciones necesitarán llamar a una función Python desde el código C / C++.

Después de jugar un poco con el Python / C API y la Numpy / C API, descubrí que muchas personas abogan por el uso de Cython en su lugar (ver por ejemplo esta pregunta o esta). No soy un experto en Cython, pero parece que para algunos casos, todavía necesita usar la API Numpy/C y saber cómo funciona. Dado el hecho de que ya tengo (un poco) conocimiento sobre la API de Python / C y ninguno sobre Cython, me preguntaba si tiene sentido seguir usando la API de Python / C, y si usar esta API tiene algunas ventajas sobre Cython. En el futuro, sin duda desarrollaré algunas cosas que no involucran computación numérica, por lo que esta pregunta no es solo sobre numpy. Una de las cosas que me gusta de la API de Python/C es el hecho de que aprendo algunas cosas sobre cómo funciona el intérprete de Python.

Gracias.

Author: Community, 2011-04-19

3 answers

Primero, hay un punto en tu pregunta que no entiendo:

[...] también quieren ser capaces de distribuir el código como bibliotecas independientes de C/C++. [...] Algunas funciones necesitarán llamar a una función Python desde el código C / C++.

¿Cómo se supone que funciona esto?

A continuación, en cuanto a su pregunta real, ciertamente hay ventajas de usar la API de Python / C directamente:

  • Lo más probable es que estés más familiarizado con la escritura de código C que con la escritura de Cython codificar.

  • Escribir tu código en C te da el máximo control. Para obtener el mismo rendimiento del código Cython que del código C equivalente, tendrás que tener mucho cuidado. No solo tendrá que asegurarse de declarar los tipos de todas las variables, también tendrá que establecer algunas banderas adecuadamente {solo un ejemplo es límites de comprobación . Necesitará un conocimiento íntimo de cómo Cython está trabajando para obtener el mejor rendimiento.

  • El código Cython depende de Python. Se no parece ser una buena idea escribir código que también debería distribuirse como biblioteca independiente de C en Cython

 6
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-20 11:26:50

La actual "respuesta superior" suena un poco demasiado como FUD en mis oídos. Por un lado, no es inmediatamente obvio que el Desarrollador Promedio escribiría código más rápido en C que lo que NumPy+Cython le da de todos modos. Por el contrario, el tiempo que se tarda en obtener el código C necesario para funcionar correctamente en un entorno Python suele invertirse mucho mejor en escribir un prototipo rápido en Cython, benchmarking it, optimizarlo, reescribirlo de una manera más rápida, benchmarking it again, y luego decidir si hay algo en él que realmente requiere el 5-10% más de rendimiento que puede o no puede obtener al reescribir el 2% del código en C afinado a mano y llamarlo desde su código Cython.

Estoy escribiendo una biblioteca en Cython que actualmente tiene alrededor de 18K líneas de código Cython, que se traducen en casi 200K líneas de código C. Una vez logré obtener una velocidad de casi el 25% para un par de funciones internas de nivel de base muy importantes, inyectando unas 20 líneas de código C afinado a mano en los lugares correctos. Me tomó un par de horas reescribir y optimizar esta pequeña parte. Eso realmente no es nada comparado con la enorme cantidad de tiempo que ahorré al no escribir (y tener que mantener) la biblioteca en C simple en primer lugar.

Incluso si conoces C mucho mejor que Cython, si conoces Python y C, aprenderás Cython tan rápido que vale la pena la inversión en cualquier caso, especialmente cuando te gustan los numéricos. 80-95% del código que escribes se benefician mucho de ser escrito en un lenguaje de alto nivel, que puede sentar y invertir la mitad del tiempo guardó en que el código sea tan rápido como si hubiera escrito en un bajo nivel lenguaje de inmediato.

Dicho esto, su comentario de que desea "poder distribuir el código como bibliotecas independientes de C/C++" es una razón válida para atenerse a C/C++normal. Cython siempre depende de CPython, que es toda una dependencia. Sin embargo, usando C/C++ simple (a excepción de la Interfaz Python) tampoco le permitirá aprovechar NumPy, ya que eso también depende de CPython. Por lo tanto, como de costumbre al escribir algo en C, tendrá que hacer mucho trabajo de base antes de llegar a la funcionalidad real. Deberías pensar seriamente en esto dos veces antes de empezar este trabajo.

 71
Author: Stefan Behnel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-22 15:14:53

La principal desventaja de la API Python/C es que puede ser muy lenta si se usa en un bucle interno. Estoy viendo que llamar a una función de Python toma un 80-160x hit sobre llamar a una función C++ equivalente.

Si eso no le molesta a su código, entonces se beneficia de poder escribir algunos trozos de código en Python, tener acceso a bibliotecas de Python, admitir devoluciones de llamada escritas directamente en Python. Eso también significa que puede hacer algunos cambios sin recompilar, haciendo prototipos sencillo.

 0
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-19 18:26:16