【发布时间】:2020-07-20 14:54:19
【问题描述】:
我一直在对一些 Pandas DataFrame 操作进行分析,并注意到第一个操作需要更长的时间,这涉及到某种静态开销。
例如在笔记本中:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': np.random.randn(1000), 'b': np.random.randn(1000)})
%%time
df['sum'] = df['a'] + df['b']
持续时间:14 毫秒
%%time
df['sum2'] = df['a'] + df['b']
持续时间:1 毫秒
我执行 %prun 并看到第一个操作正在调用 nt.stat、winreg.OpenKey,就像它出于某种原因在执行一些文件系统操作一样。我也注意到 Linux 机器上的类似行为。
是什么原因,是否可以解决?它确实减慢了我正在做的一些处理,涉及对一组小型 DataFrames 执行一批操作,并且第一次操作的开销比所有其他操作的总和要长... 任何帮助将不胜感激!
使用 Python 3.5.3 和 Pandas 0.25.3
【问题讨论】:
-
无法复制,我也是这样
-
您尝试过使用新的 Python 内核吗?哪个版本的 Python/Pandas?
-
我可以使用 Python 3.8 和
pandas==1.0.2重现此行为。运行%prun df['a'] + df['b']两次,第一次调用 1293 次,第二次调用 373 次。看起来 Pandas 在这里做了一些惰性导入。在两个不同的数据帧上运行这两个操作会产生相同的增益。所以这应该是由于一次性操作导致了一些开销(例如导入)。当您说您正在处理一批数据帧时,您应该只看到第一个数据帧的性能下降,而不是每个数据帧。 -
它实际上发生了多次(每个 DF 发生一次)但是我现在发现了问题所在。这是因为我通过迭代返回 DataFrame 切片的 groupby() 结果来获取 DataFrame 列表,然后将新列分配给切片,从而导致警告: SettingWithCopyWarning: A value is trying to be set on a copy of a slice从数据帧。这没有出现,因为该进程正在由 Web 服务器运行。每次出现此警告时都会导致延迟,我通过创建输入 DataFrame 的副本来解决问题
标签: python pandas performance dataframe