Cython命令强制显式声明所有变量

时间:2013-10-22 17:37:52

标签: python variables cython

在Cython中,众所周知,未声明的变量类型会带来更多的开销,从而减慢整个过程。

如果在嵌套循环中使用此未知变量类型,如:

def test(b, c, m, n, p):
ctype double a
for i in range(m)
    for j in range(n)
        for k in range(p)
            a = b + c
return a
开销可能会高得多。在许多变量的问题中,很容易忘记声明一个或另一个类型,并且编译器不会发出警告,因为Cython会执行所需的开销。

Cython中是否有命令强制显式声明所有变量?

2 个答案:

答案 0 :(得分:3)

  

在Cython中,众所周知,未声明的变量类型会带来更多的开销,从而减慢整个过程。

你知道错了,有(limited) type inferencenot every type annotation improves performance(例如,展开一个int参数,然后将其传递给Python不变,将其重新包装在一个新对象中)。一个更有用的指标是CPython API调用的数量,这是cython -a告诉你的。

答案 1 :(得分:1)

应该从接受的答案提出的解决方案开始。

另一个很好的解决方案是将代码的关键部分放在with nogil:块中。如果调用任何Python API,这将抛出编译错误。

通常关键部分是深度循环:

with nogil:
    for i in range(m):
        for j in range(n):
            for k in range(p):
                for l in range(q):
                    ...