2017-12-16 18 views
1

주어진 계수 범위를 가진 다항식을 생성하고 모든 루트 목록을 출력하는 함수를 만들었습니다. 그러나 Numba는 그것을 좋아하지 않습니다. 그것은 다음과 같이이다 : AssertionError를 :Python Numba Polymomial Root Lower Error with Sympy

import math 
import numpy as np 
import itertools 
from numba import jit 
from sympy.solvers import solve 
from sympy import Symbol 
from sympy import Poly 

@jit 
def polyn(ranges=[[-20,20],[-20,20],[-20,20],[-20,20]],step=4): 
    l = [] 
    x = Symbol('x') 
    rangl = [np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges] 
    coeffl = iter(itertools.product(*rangl)) 
    leng = 1 
    for i in rangl: 
     leng *= len(i) 
    for i in range(0, leng): 
     a = solve(Poly(list(next(coeffl)),x),x) 
     for j in a: 
      l.append(j) 
    return np.array(l) 

내가 이것을 실행하려고하면, 그것은 비밀을 출력 객체에 실패 (객체 모드 프론트 엔드) 나는 누군가가 도와 드릴까요 ... 이해가 안 를?

+0

Numba는 SymPy 코드의 속도를 향상시킬 수 없습니다. 이것이 병목 현상이라면 숫자 해석기를 사용해보십시오. 시도해 볼 또 다른 한가지는 일반 입방 (상징 계수가있는)을 풀고 일반 솔루션의 값을 연결하는 것입니다. – asmeurer

+0

아니, 나도 알아 -하지만 큰 배열에 걸쳐 이러한 작업의 반복을 가속화하지 않을까요? (sympy 해결) –

+0

nogil 옵션과 병렬로 실행하는 경우를 제외하고는 의심 스럽습니다. – asmeurer

답변

1

Numba가 현재 처리 할 수없는 코드에는 여러 가지가 있습니다. 당신은 같은 NumPy와 솔루션이를 교체해야

[np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges] 

: Numba가 극복 할 수없는 두 번째 것은 itertools.product이

rangl = np.empty((len(ranges), step)) 
for i in ranges: 
    rangl[i] = np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) 

첫 번째는 rangl를 구축 지능형리스트입니다. NumPy와 for 루프로이를 대체 할 수 있습니다.

일반적으로 Numba에 동의 할 때까지 주석의 아래 부분을 주석 처리하여 코드를 줄인 다음, 위에서 아래로 작업하여 컴파일 할 수없는 부분을 확인하십시오. 체계적으로 단계별로 진행하고 간단한 for 루프 및 배열과 같은 간단한 구문을 고수하려고하십시오.

+0

감사! 임의의 수의 배열에 대해 itertools.product를 어떻게 대체 할 것을 제안 하시겠습니까? –

+0

@IskyMathews : 고정 숫자로 작동시킨 다음 일반화하십시오. itertools 구현에서 영감을 얻을 수 있습니다 (일부 코드의 경우조차도). –