अगर आप सहज हैं Numba यह एक तेज शॉर्ट-सर्किट बनाने की अनुमति देता है (जैसे ही एक NaN पाया जाता है) फ़ंक्शन बंद हो जाता है:
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
फंक्शन नहीं है तो वास्तव में धीमा हो सकता है np.min
, मुझे लगता है कि क्योंकि np.min
बड़े सरणियों के लिए मल्टीप्रोसेसिंग का उपयोग होता है:
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
लेकिन अगर सरणी में एक NaN है, खासकर अगर यह स्थिति कम सूचकांकों पर है, तो यह बहुत तेज़ है:
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
इसी तरह के परिणाम साइथन या सी एक्सटेंशन के साथ प्राप्त किए जा सकते हैं, ये थोड़ा अधिक जटिल हैं (या आसानी से avaiable के रूप में bottleneck.anynan
) लेकिन अल्टीमेटली मेरे anynan
फ़ंक्शन के समान ही करें ।