python - 当不捕获转置的返回值时,Pandas 中的内存如何处理
问题描述
我正在处理最终使用df.to_csv()
. 我变成这个大数据帧的所有输入都相对于输出转置,因此在构建大数据帧时,它相对于输出转置结束。最后我转置:df.T.to_csv()
. 我知道的返回值df.T
是导致我的问题的转置数据帧,不保存df.T
它是否“帮助”我的内存使用?换个说法,比分开跑df.T.to_csv()
好?除了记忆之外,一种方法比另一种方法有什么优势吗?dfT=df.T
dfT.to_csv()
总之,哪种方法更好,为什么?:
方法一:
df.T.to_csv()
方法二:
dfT=df.T
dfT.to_csv()
解决方案
总的来说,对于这个用例,这两种方法实际上是相同的。考虑:脚本仍然会计算转置并将其存储在离子内存中,以便能够对其进行操作。唯一真正的区别可能在于这行代码运行后会发生什么。
在第一种情况下,df.T.to_csv()
计算并存储转置数据帧,将其写入文件,然后隐式指令是自动垃圾收集可以自由地使用为对象分配的内存来做它想做的事情。
在第二种情况下,因为您已经分配了它,所以隐含的指令是维护分配的内存和存储在其中的对象,直到脚本完成运行。对于第二种方法,我能想到的唯一真正的“优势”是,如果需要,您可以将转置数据帧重用于其他事情。
这在我的测试用例中肯定是正确的(使用 jupyter notebook 中的memit 内存分析器魔法):
df=pd.DataFrame(np.random.rand(10000,10000))
%%memit
df.T.to_csv('test_transpose.csv')
peak memory: 929.00 MiB, increment: 34.18 MiB
%%memit
dfT=df.T
dfT.to_csv('test_transpose.csv')
peak memory: 929.84 MiB, increment: 33.66 MiB
并且,使用时间而不是内存分析:
%%timeit
df.T.to_csv('test_transpose.csv')
2min 49s ± 6.3 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
dfT=df.T
dfT.to_csv('test_transpose.csv')
2min 51s ± 4.5 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- python - 如何在 Python 中捕获连续过程的输出?
- javascript - NodeJS中的本地文件加载问题
- java - Java MVC 通信
- c - 如何正确存储指向二叉搜索树根的指针?
- python - 用逗号和分号Python按字符串拆分为列表列表
- sql - Get the second last record in a date column within a inner join
- ios - Swift enum function with string parameter calling with a parameter of the enum class
- php - 按第一个元素组合和求和数组元素
- java - 传递到持久的分离实体:JPA OneToMany 关系
- visual-studio-code - 我想要一些关于如何在 Visual Studio Code 中使用 Mark down 功能的帮助?