Giải pháp của Ray là tốt. Tuy nhiên, trên máy của tôi, nó nhanh hơn khoảng 2,5 lần để sử dụng numpy.sum
thay cho numpy.min
:
In [13]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 244 us per loop
In [14]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 97.3 us per loop
Không giống như min
, sum
không yêu cầu phân nhánh, điều này trên phần cứng hiện đại có xu hướng khá đắt. Đây có lẽ là lý do tại sao sum
nhanh hơn.
sửa Bài kiểm tra trên được thực hiện với một NaN duy nhất ngay giữa mảng.
Điều thú vị cần lưu ý min
là sự có mặt của NaN chậm hơn so với khi không có mặt của chúng. Nó cũng có vẻ chậm hơn khi các NaN tiến gần đến phần bắt đầu của mảng. Mặt khác, sum
thông lượng của có vẻ không đổi bất kể có NaN hay không và chúng nằm ở đâu:
In [40]: x = np.random.rand(100000)
In [41]: %timeit np.isnan(np.min(x))
10000 loops, best of 3: 153 us per loop
In [42]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop
In [43]: x[50000] = np.nan
In [44]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 239 us per loop
In [45]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.8 us per loop
In [46]: x[0] = np.nan
In [47]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 326 us per loop
In [48]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop