Eğer rahatsan numba hızlı bir kısa devre oluşturmaya izin verir (bir NaN bulunur bulunmaz durur) işlevi:
import numba as nb
import math
@nb.njit
def anynan(array):
array = array.ravel()
for i in range(array.size):
if math.isnan(array[i]):
return True
return False
NaN
İşlev yoksa, aslında daha yavaş olabilir np.min
, bunun nedeni np.min
büyük diziler için çoklu işlemeyi kullanmasıdır:
import numpy as np
array = np.random.random(2000000)
%timeit anynan(array) # 100 loops, best of 3: 2.21 ms per loop
%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.45 ms per loop
%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.64 ms per loop
Ancak dizide bir NaN olması durumunda, özellikle konumu düşük endekslerde ise, o zaman çok daha hızlıdır:
array = np.random.random(2000000)
array[100] = np.nan
%timeit anynan(array) # 1000000 loops, best of 3: 1.93 µs per loop
%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.57 ms per loop
%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.65 ms per loop
Benzer sonuçlar Cython veya bir C uzantısı ile elde edilebilir, bunlar biraz daha karmaşıktır (veya olduğu gibi kolayca elde edilebilir bottleneck.anynan
) ancak nihai olarak benim işlevimle aynı şeyi yapar anynan
.