Python Cython中的高效算法与特殊方法
根据Cython关于(操作符重载)的文档,它们的实现方式,我不能依赖Python Cython中的高效算法与特殊方法,python,cython,Python,Cython,根据Cython关于(操作符重载)的文档,它们的实现方式,我不能依赖self作为调用其特殊方法的对象 显然,这有两个后果: 我无法在方法声明中指定静态类型。例如,如果我有一个类Foo,它只能乘以,比如说int,那么我就不能在没有看到TypeErrors(有时)的情况下拥有def\uu mul\uuuuuuuuuuuuuuuuuuuuuu(self,int op) 为了决定要做什么,我必须检查操作数的类型,大概是使用isinstance()来处理子类,这在操作符中似乎非常昂贵 在保留运算符语法的便
self
作为调用其特殊方法的对象
显然,这有两个后果:
Foo
,它只能乘以,比如说int
,那么我就不能在没有看到TypeError
s(有时)的情况下拥有def\uu mul\uuuuuuuuuuuuuuuuuuuuuu(self,int op)
isinstance()
来处理子类,这在操作符中似乎非常昂贵在保留运算符语法的便利性的同时,有什么好方法来处理这个问题吗?我将类切换到Cython扩展类型的全部原因是为了提高效率,但由于它们严重依赖于算术方法,基于上述情况,似乎我实际上会让它们变得更糟。如果我正确理解文档和测试结果,您实际上可以获得一个快速的
\u mul\u(self,int op)
在Foo
上,但只能将其用作Foo()*4
,而不能用作4*Foo()
。后者需要\uu rmul\uu
,这是不受支持的,因此它总是引发类型错误
第二个参数是typedint
这一事实意味着Cython会为您执行类型检查,因此您可以确保左参数确实是self
您是正确的,我正在考虑采用这种方法,但当然它并没有保留运算符语法的全部便利性。