为什么在Python中的布尔值上,“ any”有时会比“ max”要快得多,有时却慢得多?

时间:2019-04-30 14:05:18

标签: python pandas performance

考虑以下代码:

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”的速度比“任何”。为什么?

2 个答案:

答案 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)