이 질문의 후속 조치는 function types in numba입니다.생성자 인수
저는 생성기를 인수로 사용해야하는 함수를 작성하고 있습니다. 그것은 발전기의 첫 번째 n
요소의 합계를 반환
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
: 그것은 여기에 붙여, 그래서이 장난감의 예를 고려하는 것이 너무 복잡합니다. 사용 예제 :
내가nopython=True
컴파일하고 싶습니다 그리고 내가
gen
을 통과 할 수 없기 때문에 그것은 카레 것
@numba.njit()
def odd_numbers():
n = 1
while True:
yield n
n += 2
take_and_sum(odd_numbers())(3) # prints 9
(A pyobject
) 인수로. 나는 nopython
내 발전기를 컴파일하더라도
TypingError: Failed at nopython (nopython frontend)
Untyped global name 'gen'
: 불행하게도, nopython=True
에 오류가 발생합니다.
정말로 이것에 대해 혼란은 하드 코딩 입력이 작동한다는 것입니다 :
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
그래, 내 numba 문제의 근본 원인은 로컬이 아닌 변수를 쓰기 가능으로 포착 할 수 없다는 것입니다. – user357269