python - 为什么 Cython Decorator 版本比 Cython Pyx 版本慢?

标签 python cython

我正在尝试各种方法在 Cython 中编写阶乘函数。首先我在 iPython Notebook 中尝试了 pyx 文件版本。

%%file pyxfact.pyx
cdef long pyxfact(long n):
    if n <=0:
        return 1
    else:
        return n * pyxfact(n-1)

def fact(long n):
    return pyxfact(n)

然后我在 Cython 装饰器中尝试了相同的操作,至少我是这么认为的,如下所示:

%%file cydecofact.py
import cython

@cython.cfunc # equivalent to cdef, while @cython.ccall is equivalent to cpdef
@cython.returns(cython.long)
@cython.locals(n=cython.long)
def deco_fact(n):
    if n <=0:
        return 1
    else:
        return n * deco_fact(n-1)

@cython.locals(n=cython.long)
def fact(n):
    return deco_fact(n)

令我惊讶的是,这两个版本的运行时间差异巨大:

%timeit -n 10000 pyxfact.fact(10)
%timeit -n 10000 cydecofact.fact(10)

10000 loops, best of 3: 219 ns per loop
10000 loops, best of 3: 2 µs per loop

最佳答案

您需要一个@cython.compile来实际编译代码。但是,@cython.compile 似乎既不支持 cython.cfunc 也不支持递归。

关于python - 为什么 Cython Decorator 版本比 Cython Pyx 版本慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484804/

相关文章:

Python .get 从嵌套字典中获取

python - 提高 Pandas 合并性能

python - 安装扩展模块的混合物。纯 python 模块和带有 distutils 的共享库

c - 如何从 C 创建 Cython cdef 公共(public)类

Python 'float64' 无法转换为 MySQL 类型,但在手动查询中没问题

python - 用于捕获科学引文的正则表达式

python - Pip 安装 Django Windows 10

c++ - 无法将 'vector<unsigned long>' 转换为 Python 对象

python - 将 ndarray 转换为 cv::Mat 的最简单方法是什么?

python - 在Google Colab上通过网络摄像头从视频中实时捕获帧