首页 > 解决方案 > 当不捕获转置的返回值时,Pandas 中的内存如何处理

问题描述

我正在处理最终使用df.to_csv(). 我变成这个大数据帧的所有输入都相对于输出转置,因此在构建大数据帧时,它相对于输出转置结束。最后我转置:df.T.to_csv(). 我知道的返回值df.T是导致我的问题的转置数据帧,不保存df.T它是否“帮助”我的内存使用?换个说法,比分开跑df.T.to_csv()好?除了记忆之外,一种方法比另一种方法有什么优势吗?dfT=df.TdfT.to_csv()

总之,哪种方法更好,为什么?:

方法一:

df.T.to_csv()

方法二:

dfT=df.T
dfT.to_csv()

标签: pythonpandasperformancedataframememory

解决方案


总的来说,对于这个用例,这两种方法实际上是相同的。考虑:脚本仍然会计算转置并将其存储在离子内存中,以便能够对其进行操作。唯一真正的区别可能在于这行代码运行会发生什么。

在第一种情况下,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)

推荐阅读