Numba, sayısal kodun yürütülmesini hızlandırmak için harika bir çözüm gibi görünüyor. Bununla birlikte, bir Numba dizisine atamalar olduğunda standart Python kodundan daha yavaş görünür. Bu örneği, Numba ile birlikte/olmadan dört alternatifi karşılaştırarak bir dizi/skaler:Numba yavaş mı?
(Hesaplamalar, bir diziye atama veya öbeğe atamak olan soruna odaklanmak için çok basit tutuldu. bende dört alternatifleri değerlendirmek üzere ipython en% sürümüyle gelen timeit kullanarak hücre)
@autojit
def fast_sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
def sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
@autojit
def fast_sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
def sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
: Numba ile derlenmiş değildi olduğu
In [125]: %timeit fast_sum_arr(arr)
100 loops, best of 3: 10.8 ms per loop
In [126]: %timeit sum_arr(arr)
100 loops, best of 3: 4.11 ms per loop
In [127]: %timeit fast_sum_sclr(arr)
100000 loops, best of 3: 10 us per loop
In [128]: %timeit sum_sclr(arr)
100 loops, best of 3: 2.93 ms per loop
sum_arr, iki kat daha hızlı fast_sum_arr olarak daha hangi Numba ile derlenmiştir. Öte yandan, , Numba ile derlenmiş olan olan fast_sum_sclr, Sumba ile derlenmemiş olan sum_sclr'den iki kat büyüklükte daha hızlıdır.
Numba, sum_sclr'ı hızlandırma görevini dikkat çekici derecede iyi gerçekleştirir, ancak aslında sum_arr'ın daha yavaş çalışmasını sağlar. Sum_sclr ve sum_arr arasındaki tek fark, birincinin bir dizi hücresine atarken bir skaler atamasıdır.
herhangi bir ilişki olup olmadığını bilmiyorum, ama son zamanlarda blogda http://www.phi-node.com/ aşağıdaki okuyun:
"Bu Numba herhangi bir yapı ile karşı karşıya olduğunda doğrudan desteklemediği çıkıyor, bunu (çok) yavaş kod yoluna geçer. "
Blog yazarı, Python'un max() yerine bir if deyimini kullanarak çok daha hızlı gerçekleştirmek için Numba'yı aldı.
Bu konuyla ilgili herhangi bir bilgi var mı?
sayesinde
FS
Döngünün ne yapması gerektiğini anlamıyorum. Bu etkili bir şekilde değil mi? Z [1:] + = arr [1:] ', ya da' z' ve 'r' aynı değerlere sahip olduğundan, z [1:] * = 2'? Bunun açık bir döngüden çok daha hızlı olmasını beklerdim, ancak bir derleyicinin anlatabileceğini sanmam. – Blckknght