หากคุณพอใจกับ 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
ผลลัพธ์ที่คล้ายกันอาจทำได้ด้วย Cython หรือส่วนขยาย C สิ่งเหล่านี้ซับซ้อนกว่าเล็กน้อย (หรือใช้งานได้ง่ายbottleneck.anynan
) แต่ในที่สุดก็ทำเช่นเดียวกับanynan
ฟังก์ชันของฉัน