que - sintaxis python
¿Hay ventajas de utilizar la interfaz Python/C en lugar de Cython? (3)
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 C / C ++ independientes. Me gustaría que estas bibliotecas usen float de precisión simple y doble. Algunos ejemplos de funciones que escribiré son gradientes conjugados para resolver sistemas lineales o métodos acelerados de primer orden. Algunas funciones necesitarán llamar a una función de Python desde el código C / C ++.
Después de jugar un poco con la API de Python / C y 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 en algunos casos , aún necesitas 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, ciertamente desarrollaré algunas cosas que no impliquen computación numérica, por lo que esta pregunta no es solo sobre numpy. Una de las cosas que me gusta de Python / C API es el hecho de que aprendo algunas cosas sobre cómo funciona el intérprete de Python.
Gracias.
La "respuesta principal" actual suena un poco como FUD en mis oídos. Por un lado, no es inmediatamente obvio que el desarrollador promedio escribiría un código más rápido en C que lo que NumPy + Cython le da de todos modos. Muy por el contrario, el tiempo que lleva incluso para obtener el código C necesario para funcionar correctamente en un entorno de Python se invierte mucho mejor en escribir un prototipo rápido en Cython, compararlo, optimizarlo, reescribirlo de forma más rápida y compararlo de nuevo, y luego decidir si hay algo en él que realmente requiera del 5-10% más de rendimiento que puede o no obtener reescribiendo el 2% del código en C ajustado a mano y llamándolo 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 aceleración de casi el 25% para un par de funciones internas de nivel muy importantes, inyectando unas 20 líneas de código C ajustado a mano en los lugares correctos. Me llevó un par de horas reescribir y optimizar esta pequeña parte. Eso es realmente nada en comparación con la gran cantidad de tiempo que ahorré al no escribir (y tener que mantener) la biblioteca en la 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 invertir en cualquier caso, especialmente cuando te interesan los numéricos. El 80-95% del código que escribe se beneficiará tanto de estar escrito en un lenguaje de alto nivel, que puede recostarse de forma segura e invertir la mitad del tiempo ahorrado en hacer su código tan rápido como si lo hubiera escrito en un lenguaje de bajo nivel de inmediato.
Dicho esto, su comentario de que desea "poder distribuir el código como bibliotecas C / C ++ independientes" es una razón válida para apegarse a C / C ++ sencillo. Cython siempre depende de CPython, que es una gran dependencia. Sin embargo, usar C / C ++ sin formato (a excepción de la interfaz de Python) tampoco le permitirá aprovechar NumPy, ya que eso también depende de CPython. Por lo tanto, como es habitual al escribir algo en C, tendrá que hacer un montón de trabajo antes de llegar a la funcionalidad real. Deberías pensar seriamente sobre esto dos veces antes de comenzar este trabajo.
La principal desventaja de la API de Python / C es que puede ser muy lenta si se usa en un bucle interno. Veo que llamar a una función de Python toma un golpe de 80-160x sobre llamar a una función equivalente de C ++.
Si eso no molesta a su código, entonces se beneficiará al poder escribir algunos fragmentos de código en Python, tener acceso a las bibliotecas de Python y admitir devoluciones de llamadas escritas directamente en Python. Eso también significa que puede hacer algunos cambios sin volver a compilar, lo que facilita la creación de prototipos.
Primero, hay un punto en su pregunta que no entiendo:
[...] también quiero ser capaz de distribuir el código como librerías C / C ++ independientes. [...] Algunas funciones necesitarán llamar a una función de Python desde el código C / C ++.
¿Cómo se supone que esto funcione?
A continuación, en cuanto a su pregunta real, sin duda hay ventajas de usar la API de Python / C directamente:
Lo más probable es que estés más familiarizado con escribir el código C que escribir el código de Cython.
Escribir su código en C le da el máximo control. Para obtener el mismo rendimiento del código de Cython a partir del código C equivalente, deberá tener mucho cuidado. No solo tendrá que asegurarse de declarar los tipos de todas las variables, sino que también deberá establecer algunos indicadores de manera adecuada; solo un ejemplo es la comprobación de límites . Necesitará un conocimiento profundo de cómo Cython está trabajando para obtener el mejor rendimiento.
El código de Cython depende de Python. No parece ser una buena idea escribir código que también se deba distribuir como una biblioteca de C independiente en Cython.