假设我有以下功能:
@cython.boundscheck(False)
@cython.wraparound(False)
cpdef bint test(np.int_t [:] values):
cdef Py_ssize_t n_values = len(values)
cdef int i
for i in prange(n_values,nogil=True):
if i ==0:
return 0
print 'test'
我这样运行:
In [1]: import algos
In [2]: import numpy as np
In [3]: algos.test(np.array([1,2,3,1,4,5]))
test
Out[3]: False
为什么功能打印应该在没有打印的情况下退出?有没有办法让函数在到达返回时退出?
谢谢。
答案 0 :(得分:1)
documentation is clear that this is a bit of a minefield since there's no guarantee which iteration finishes first。我认为他们没有明确表达的额外复杂性是,如果迭代次数足够小(如果完成一个线程),你也可以在prange
之后继续,这就是你见。
对我来说似乎有用的是使用循环的else
子句,只有在它没有提前完成时才会执行:
for i in prange(n_values,nogil=True):
# stuff ...
else:
with gil:
print "test"
快速查看C代码表明,这是在进行适当的检查,它应该是可靠的。