저는 파이썬을 처음 접했고 numba를 가지고 놀았고 numba에서 순수한 파이썬보다 느리게 실행되는 코드를 작성했습니다. 적은 수의 경우 순수 파이썬은 numba보다 약 4 배 빠르며 많은 수에서는 거의 동일하게 실행됩니다. 내 코드가 numba에서 느리게 실행되는 이유는 무엇입니까?
from numba import njit
@njit
def forr (q):
p=0
k=q
n=0
while k!=0:
n += 1
k=k//10
h=(abs(q-n*9)+q-n*9)//2
for j in range(q,h,-1):
s=0
k=j
while k!=0:
s += k%10
k=k//10
if s+j==q:
p=1
print('Yes')
break
if p==0:
print('No')
Numba 코드가 느리게 실행되는 이유는 다음과 같습니다.
cache = True
옵션을 넣지 않았습니다 @njit
.이 옵션은 처음부터 컴파일하는 대신 각 스크립트 실행시 미리 컴파일 된 코드를 가져 오는 데 도움이됩니다.위의 모든 것을 취하여 Numba 코드를 측정하기 위해 다음 코드를 구현 cache = True
하고 방금 옵션을 추가 하고 print()
측정 시간에 대한 호출을 주석 처리했습니다 (측정 할 때 수백 단어로 콘솔을 망치지 않도록).
다음 코드는 Numba 변형이 29x
랩톱에서 배 더 빠르다 는 것을 보여줍니다 . 또한 다음 코드는 command를 통해 한 번 pip 모듈을 설치해야합니다 pip install numba timerit
.
import timerit, numba
timerit.Timerit._default_asciimode = True
def forr(q):
p=0
k=q
n=0
while k!=0:
n += 1
k=k//10
h=(abs(q-n*9)+q-n*9)//2
for j in range(q,h,-1):
s=0
k=j
while k!=0:
s += k%10
k=k//10
if s+j==q:
p=1
#print('Yes')
break
if p==0:
#print('No')
pass
nforr = numba.njit(cache = True)(forr)
nforr(2) # Heat-up, precompile numba
tb = None
for f in [forr, nforr]:
tim = timerit.Timerit(num = 99, verbose = 1)
for t in tim:
f(1 << 60)
if tb is None:
tb = tim.mean()
else:
print(f'speedup {round(tb / tim.mean(), 1)}x')
산출:
Timed best=1.029 ms, mean=1.040 +- 0.0 ms
Timed best=35.300 us, mean=35.673 +- 0.3 us
speedup 29.2x
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다