Python Cython中的高效算法与特殊方法

Python Cython中的高效算法与特殊方法,python,cython,Python,Cython,根据Cython关于(操作符重载)的文档,它们的实现方式,我不能依赖self作为调用其特殊方法的对象 显然,这有两个后果: 我无法在方法声明中指定静态类型。例如,如果我有一个类Foo,它只能乘以,比如说int,那么我就不能在没有看到TypeErrors(有时)的情况下拥有def\uu mul\uuuuuuuuuuuuuuuuuuuuuu(self,int op) 为了决定要做什么,我必须检查操作数的类型,大概是使用isinstance()来处理子类,这在操作符中似乎非常昂贵 在保留运算符语法的便

根据Cython关于(操作符重载)的文档,它们的实现方式,我不能依赖
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
    ,这是不受支持的,因此它总是引发
    类型错误


    第二个参数是typed
    int
    这一事实意味着Cython会为您执行类型检查,因此您可以确保左参数确实是
    self

    您是正确的,我正在考虑采用这种方法,但当然它并没有保留运算符语法的全部便利性。