Pandas比NumPy慢得多吗?

7
以下代码表明pandas在clip()函数这个特定情况下可能比numpy慢得多。令人惊讶的是,即使在numpy中执行计算、然后从pandas回到numpy并再次返回pandas,仍然比在pandas中执行要快得多。
难道不应该用这种绕路的方式来实现pandas函数吗?
In [49]: arr = np.random.randn(1000, 1000)

In [50]: df=pd.DataFrame(arr)

In [51]: %timeit np.clip(arr, 0, None)
100 loops, best of 3: 8.18 ms per loop

In [52]: %timeit df.clip_lower(0)
1 loops, best of 3: 344 ms per loop

In [53]: %timeit pd.DataFrame(np.clip(df.values, 0, None))
100 loops, best of 3: 8.4 ms per loop

2
没问题,因为Pandas在剪辑的基础上进行了许多数据检查、转换和其他操作。 - alko
我也像@alko列举的那样,被所有的pandas开销所震惊。索引是另一个使pandas与numpy不同的现实。观看演讲Sofia Heisler No More Sad Pandas Optimizing Pandas Code for Speed and Efficiency PyCon 2017,了解一些关于pandas开销的评论和影响以及一堆丰富的比较,其中并非全部是numpy vs pandas。然而,使用.values的示例可以进行直接比较。 - jxramos
2个回答

11
在主分支的0.13版本(即将发布)中,这个操作速度更快了(仍然比本地numpy慢一些,因为需要处理对齐/数据类型/NaN值)。在0.12版本中是按列应用,因此这是一个相对昂贵的操作。
In [4]: arr = np.random.randn(1000, 1000)

In [5]: df=pd.DataFrame(arr)

In [6]: %timeit np.clip(arr, 0, None)
100 loops, best of 3: 6.62 ms per loop

In [7]: %timeit df.clip_lower(0)
100 loops, best of 3: 12.9 ms per loop

0
在我的基准测试中,np.maximum 是最快的,无论是在 df 还是 numpy.array 中操作。
arr = np.random.randn(1000, 1000)

df = pd.DataFrame(arr)

%%timeit
np.clip(arr, 0, None)
# 4.55 ms ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
df.clip(lower=0.0)
# 5.62 ms ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
np.maximum(arr, 0)
# 4.53 ms ± 9.23 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
np.maximum(df, 0)
# 4.65 ms ± 5.13 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接