考虑以下代码:
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)
在布尔型pandas上,我们看到“ any”的运行速度比“ max”快。但是,当我们尝试对100个组的数据进行分组和转换时,突然间“ max”的速度比“任何”。为什么?
答案 0 :(得分:2)
因为any
的评估是懒惰的。这意味着any
函数将在第一个True
布尔元素处停止。
max
之所以不能这样做,是因为它需要检查序列中的每个元素以确保它没有错过任何更大的元素。
这就是为什么,max
总是将检查所有元素,而any
仅检查第一个True
之前的元素。
max
工作更快的情况可能是类型强制的情况,因为numpy中的所有值都以其自己的类型和格式存储,数学运算可能比python的any
更快。
答案 1 :(得分:0)
如评论中所述,当any
时,python np.any
函数具有短路机制
没有。参见here。
但是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)