考虑以下代码:
import numpy as np
import pandas as pd
a = pd.DataFrame({'case': np.arange(10000) % 100,
'x': np.random.rand(10000) > 0.5})
%timeit any(a.x)
%timeit a.x.max()
%timeit a.groupby('case').x.transform(any)
%timeit a.groupby('case').x.transform(max)
13.2 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
195 µs ± 811 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
25.9 ms ± 555 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.43 ms ± 13.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
b = pd.DataFrame({'x': np.random.rand(100) > 0.5})
%timeit any(b.x)
%timeit b.x.max()
13.1 µs ± 205 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
81.5 µs ± 1.81 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
我们看到,"任何"的工作速度比布尔熊猫的" max"更快。"任何"。为什么?
因为any
评估是懒惰的。这意味着any
函数将停止在第一个True
布尔元素。
max
不能这样做,因为它需要在序列中检查每个元素,以确保它没有错过任何更大的元素。
这就是为什么,当any
在第一个True
之前仅检查元素时,max
总是会检查所有元素。
当max
工作速度更快的情况可能是具有类型胁迫的情况,因为Numpy中的所有值都以自己的类型和格式存储,数学操作可能比Python的any
更快。
如评论中所述,python any
fonction具有短路机制,当np.any
时没有。请参阅此处。
但是True in a.x
甚至更快:
%timeit any(a.x)
53.6 µs ± 543 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit True in (a.x)
3.39 µs ± 31.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)