在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中是否有命令强制显式声明所有变量?
答案 0 :(得分:3)
在Cython中,众所周知,未声明的变量类型会带来更多的开销,从而减慢整个过程。
你知道错了,有(limited) type inference和not 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):
...