Métodos especiales aritméticos eficientes en Cython

De acuerdo con la documentación de Cython con respecto a metodos aritmeticos especiales (sobrecargas del operador), la forma en que se implementan, no puedo confiar en self siendo el objeto cuyo método especial está siendo llamado.

Evidentemente, esto tiene dos consecuencias:

  1. No puedo especificar un tipo estático en la declaración del método. Por ejemplo, si tengo una clase Foo que sólo puede ser multiplicado por, digamos, un int, entonces no puedo tener def __mul__(self, int op) sin ver TypeErrors (a veces).
  2. Para decidir qué hacer, tengo que verificar los tipos de operandos, presumiblemente usando isinstance() para manejar subclases, lo que parece ridículamente caro en un operador.

¿Hay alguna buena manera de manejar esto manteniendo la conveniencia de la sintaxis del operador? Toda mi razón para cambiar mis clases a los tipos de extensión de Cython es mejorar la eficiencia, pero como dependen en gran medida de los métodos aritméticos, según lo anterior, parece que en realidad los empeoraré.

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

Si entiendo los documentos y los resultados de mi prueba correctamente, en realidad puede tener una rápida __mul__(self, int op) en un Foo, pero solo puedes usarlo como Foo() * 4no, 4 * Foo(). Esto último requeriría una __rmul__, que no es compatible, por lo que siempre plantea TypeError.

El hecho de que el segundo argumento se escriba int significa que Cython hace la verificación de tipos por usted, por lo que puede estar seguro de que el argumento de la izquierda es realmente self.

respondido 09 mar '12, 15:03

Tienes razón, y estoy considerando ir por ese camino, pero por supuesto no retiene el ser completados conveniencia de la sintaxis del operador. - ezod

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.