【问题标题】:Why is Cython Decorator version slower than Cython Pyx version?为什么 Cython Decorator 版本比 Cython Pyx 版本慢?
【发布时间】:2015-08-11 14:05:25
【问题描述】:

我正在尝试各种方法在 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 装饰器创建 .py 文件不会自动将 python 文件转换为 cython 文件,它只是允许在不编译的情况下运行相同的文件。此外,在 ipython notebook 中,有一个 %%cython 魔法可以自动编译过程。
  • @DaveP 我知道我必须用 Cython 装饰器编译纯 python 代码。我创建了一个新的 %%cython 单元格并在其中写入了import cydecofactdeco_fact2 = cydecofact.deco_fact。然后我测试了 deco_fact2 但它仍然很慢。

标签: python cython


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 2014-08-10
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多