2012-04-27 11 views
6

Aquí está mi problema básico:La sobrecarga de Python funciones matemáticas utilizando Cython

Tengo un archivo de Python con una importación de

from math import sin,cos,sqrt 

necesito este archivo para seguir siendo 100% CPython compatibles como para que mis desarrolladores escribir el código 100% CPython y emplear las excelentes herramientas desarrolladas para Python.

Ahora ingrese Cython. En mi archivo de Python, las funciones trigonométricas se llaman millones de veces (fundamental para el código, no puede cambiar esto). ¿Hay alguna manera de que a través de algunos de Python-Fu en el archivo principal de pitón, o la magia Cython de lo contrario su lugar puede utilizar la C/C++ funciones matemáticas utilizando alguna variación en el código Cython

cdef extern from "math.h": 
    double sin(double) 

Eso me daría NEAR C rendimiento, que sería increíble.

Stefan's talk específicamente dice que esto no se puede hacer, pero la charla es de dos años, y hay mucha gente creativa por ahí

+3

Estoy bastante seguro de CPython ya utiliza estas funciones internamente. ¿Por qué reimplementarían las operaciones matemáticas básicas? – ThiefMaster

+4

Si va a llamar a las funciones trigonométricas para una gran cantidad de valores, considere empacar esos valores en matrices Numpy y llamar a 'np.sin' y sus amigos. –

+0

@ThiefMaster - Después de mirar el código .c que Cython generó a partir de mi archivo que importó la función sqrt, no usa las versiones math.h, lo que es desafortunado – ibell

Respuesta

2

No soy un experto Cython, pero que yo sepa, lo único que podría hacer es escriba un contenedor de Cython alrededor del sin y llámelo. No puedo imaginar que vaya a ser más rápido que math.sin, ya que todavía usa la semántica de llamadas de Python: la sobrecarga está en todas las cosas de Python para llamar a la función, no en los cálculos trigonométricos reales, que se hacen en C cuando usando CPython también.

¿Ha considerado usar Cython pure mode, que hace que la fuente sea compatible con CPython?

+0

Exactamente, estoy tratando de hacerlo en modo Python puro . Parece, y creo que puedo verificar esto, que Cython hace la magia bajo el capó para usar las funciones 'math.h'. – ibell

+0

EDITAR: Cython no utiliza las funciones matemáticas c/C++, incluso cuando las variables están tipadas estáticamente. – ibell

+2

@ibell: lo hace cuando se importan explícitamente: 'from libc.math cimport sqrt'. –

0

que puede haber entendido mal su problema, pero el Cython documentation on interfacing with external C code parece sugerir la siguiente sintaxis:

cdef extern from "math.h": 
    double c_sin "sin" (double) 

que da la función el nombre sin en el código C (para que se enlaza correctamente a la función de math.h) y c_sin en el módulo de Python. Sin embargo, no estoy seguro de entender lo que esto se logra en este caso. ¿Por qué querrías usar math.sin en el código de Cython? ¿Tiene algunas variables tipadas estáticamente y algunas dinámicas?

+0

Desafortunadamente, a menos que me falta algo, no servirá de nada. Traté de agregarlo a mi archivo PXD por capricho, pero no parecía funcionar. Gracias por tu ayuda. – ibell

2

En una example de la documentación de Cython, utilizan un cimport de una biblioteca C para lograrlo:

from libc.math cimport sin 
+0

Pero esta importación no sobrescribe la importación desde la biblioteca de python en modo python puro – ibell

+0

¿Por qué no consulta al usuario un argumento de línea de comando o parámetro de función que indica a su código si está ejecutando en python o Cython, y, en consecuencia, importar la función 'pecado' apropiada? –

Cuestiones relacionadas