1

在 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 中是否有命令强制显式声明所有变量?

4

2 回答 2

3

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

你知道错了,有(有限的)类型推断并不是每个类型注释都能提高性能(例如,解开一个 int 参数,然后将它原封不动地传递给 Python,将它包装在一个新对象中)。一个更有用的指标是 CPython API 调用的数量,这就是cython -a告诉你的。

于 2013-10-22T18:02:55.123 回答
1

肯定应该从公认答案提出的解决方案开始。

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

通常,关键部分是一个深度 for 循环:

with nogil:
    for i in range(m):
        for j in range(n):
            for k in range(p):
                for l in range(q):
                    ...
于 2014-02-07T07:41:44.200 回答