当不捕获转置的返回值时,如何在 Pandas 中处理内存



我正在处理一个大型数据帧(~100,000x1000),我最终使用df.to_csv()输出。我转换为这个大数据帧的所有输入都是相对于输出转置的,因此在构建大型数据帧时,它相对于输出结束转置。最后我转置:df.T.to_csv().我知道df.T的返回值是转置的 数据帧导致我的问题,通过不保存df.T它是否"帮助"我的内存使用?换个说法,df.T.to_csv()dfT=df.T好吗,dfT.to_csv()单独运行?除了内存之外,一种方法比另一种方法有什么优势吗?

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

方法1:

df.T.to_csv()

方法2:

dfT=df.T
dfT.to_csv()

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

在第一种情况下,df.T.to_csv()计算并存储转置数据帧,将其写入文件,然后隐式指令是自动垃圾回收可以自由地使用为对象分配的内存执行操作。

在第二种情况下,由于您已分配它,因此隐式指令是维护分配的内存和存储在其中的对象,直到脚本完成运行。对于第二种方法,我能想到的唯一真正的"优势"是,如果需要,您可以将转置数据帧重用于其他事情。

这在我的测试用例中当然是正确的(使用 jupyter 笔记本中的内存分析器魔术):

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)

最新更新