Cython中高效的算术特殊方法

时间:2012-03-09 15:42:32

标签: python cython

根据关于arithmetic special methods(运算符重载)的Cython文档,它们的实现方式,我不能依赖self作为其特殊方法被调用的对象。

显然,这有两个后果:

  1. 我无法在方法声明中指定静态类型。例如,如果我有一个Foo类,只能乘以int,那么在没有看到def __mul__(self, int op)的情况下我就不能TypeError )。
  2. 为了决定做什么,我必须检查操作数的类型,大概是使用isinstance()来处理子类,这在运算符中看起来很贵。
  3. 在保留操作符语法的便利性的同时,有没有什么好方法可以解决这个问题?我将我的类转换为Cython扩展类型的全部原因是为了提高效率,但由于它们严重依赖于算术方法,基于上述情况,我似乎真的会让它们变得更糟。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了文档和测试结果,那么__mul__(self, int op)实际上可以快速Foo,但您只能将其用作Foo() * 4,而不是{{1} }}。后者需要4 * Foo(),这是不受支持的,因此总是会引发__rmul__

第二个参数是TypeError类型的事实意味着Cython为你做了类型检查,所以你可以确定左参数确实是int