【发布时间】:2017-06-11 04:30:52
【问题描述】:
对此问题的跟进:function types in numba。
我正在编写一个需要将生成器作为其参数之一的函数。在这里粘贴太复杂了,所以考虑这个玩具示例:
def take_and_sum(gen):
@numba.jit(nopython=False)
def inner(n):
s = 0
for _ in range(n):
s += next(gen)
return s
return inner
它返回生成器的第一个 n 元素的总和。用法示例:
@numba.njit()
def odd_numbers():
n = 1
while True:
yield n
n += 2
take_and_sum(odd_numbers())(3) # prints 9
这是 curried,因为我想用 nopython=True 编译,然后我不能将 gen(pyobject)作为参数传递。不幸的是,nopython=True 出现错误:
TypingError: Failed at nopython (nopython frontend)
Untyped global name 'gen'
即使我 nopython 编译了我的生成器。
真正令人困惑的是,对输入进行硬编码是可行的:
def take_and_sum():
@numba.njit()
def inner(n):
gen = odd_numbers()
s = 0.0
for _ in range(n):
s += next(gen)
return s
return inner
take_and_sum()(3)
我也尝试将我的生成器变成一个类:
@numba.jitclass({'n': numba.uint})
class Odd:
def __init__(self):
self.n = 1
def next(self):
n = self.n
self.n += 2
return n
同样,这在对象模式下有效,但在 nopython 模式下,我得到了无法搜索的结果:
LoweringError: Failed at nopython (nopython mode backend)
Internal error:
NotImplementedError: instance.jitclass.Odd#4aa9758<n:uint64> as constant unsupported
【问题讨论】: