python - 为什么 Pandas DataFrame 的第一次操作耗时最长?
问题描述
我一直在对一些 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
解决方案
这个问题在一个会话中多次发生(不仅仅是一次导入),但我已经找到了原因。这是因为我通过迭代返回 DataFrame 切片的 groupby() 结果来获取 DataFrame 列表,然后将新列分配给切片,从而导致警告:
SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值。
这没有出现,因为该进程正在由 Web 服务器运行。每次出现此警告时,都会导致我注意到的延迟。
通过在应用操作之前创建输入 DataFrame 的副本来修复问题
推荐阅读
- data-structures - 不同图遍历方法的区别
- php - Symfony 5.x - 加载 Web 调试工具栏时出错
- sql - 如何计算一个时间段之间的条目数
- wordpress - 意外更改网站 URL 后找不到 Wordpress 网站
- html - 容器没有调整到页面的全宽
- jenkins - 如何在我的 Jenkinsfile 中使用 linux 系统变量?
- google-chrome-extension - 为什么 chrome 扩展程序不起作用 - 代码有什么问题吗?
- java - 我在 java swing 上调用 setVisible 并没有任何反应
- oracle - 将本地 TNS 侦听器指向远程数据库
- postgresql - 如何在 Sequelize UPDATE 中设置 jsonb_column = json_build_array( string_column )?