Wenn Sie sich wohl fühlen numba Es ermöglicht die Erzeugung eines schnellen Kurzschlusses (stoppt, sobald ein NaN gefunden wird):
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
Wenn dies nicht NaN
der Fall ist, ist die Funktion möglicherweise langsamer als np.min
. Ich denke, das liegt daran, dass np.min
Multiprocessing für große Arrays verwendet wird:
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
Wenn sich jedoch ein NaN im Array befindet, insbesondere wenn seine Position bei niedrigen Indizes liegt, ist es viel schneller:
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
Ähnliche Ergebnisse können mit Cython oder einer C-Erweiterung erzielt werden. Diese sind etwas komplizierter (oder leicht verfügbar als bottleneck.anynan
), tun aber letztendlich das Gleiche wie meine anynan
Funktion.