![](/img/trans.png)
[英]Applying function to pandas dataframe: is there a more memory-efficient way of doing this?
[英]How to rename a pandas dataframe in a memory-efficient way (without creating a copy)?
这个问题的正确答案:
"How to rename a pandas dataframe in a more memory-efficient way, similar to inplace = True?"
是:
newName = oldName
已经是一种内存有效的重命名方法
让我们总结一下以下内容:
由于df_new = df_old
,因此内存需求没有明显变化
有一个很好的ressource解释这一切这里讲:
Python的内存管理对其行为如此重要,不仅您不必删除值,而且无法删除值。 您可能已经看到了del语句:
nums = [1, 2, 3]
del nums
这不会删除数值num,而是删除名称nums。 该名称从其作用域中删除,然后进行常规引用计数:如果nums的值只有一个引用,则将回收该值。 但是,如果它有其他引用,则不会。
以下所有大量内容仅是为了提供上述证明。
请参阅此代码:
from memory_profiler import profile
@profile(precision=4)
def my_func():
import pandas
df_old = pandas.DataFrame([1,2,3,4,5])
print(df_old)
print(id(df_old))
df_new = df_old
print(id(df_new), id(df_old))
del df_old
my_func()
在我的盒子上可以看到:
>python3.6 -u "renamePandas_Cg.py"
0
0 1
1 2
2 3
3 4
4 5
140482968978768
140482968978768 140482968978768
Filename: renamePandas_Cg.py
Line # Mem usage Increment Line Contents
================================================
3 31.1680 MiB 0.0000 MiB @profile(precision=4)
4 def my_func():
5 64.1250 MiB 32.9570 MiB import pandas
6
7 64.1953 MiB 0.0703 MiB df_old = pandas.DataFrame([1,2,3,4,5])
8 64.6680 MiB 0.4727 MiB print(df_old)
9 64.6680 MiB 0.0000 MiB print(id(df_old))
10 64.6680 MiB 0.0000 MiB df_new = df_old
11 64.6680 MiB 0.0000 MiB print(id(df_new), id(df_old))
12 64.6680 MiB 0.0000 MiB del df_old
事实证明,注释中所说的实际上是事实,因为df_old和df_new都指向内存中的相同地址,并且由于df_new = df_old
在内存中没有增加 。
让我们看看是否显示内存增加仅仅是因为精度太低。 在这里,presision的结果= 7:
>python3.6 -u "renamePandas_Cg.py"
0
0 1
1 2
2 3
3 4
4 5
140698387071216
140698387071216 140698387071216
Filename: renamePandas_Cg.py
Line # Mem usage Increment Line Contents
================================================
3 31.1718750 MiB 0.0000000 MiB @profile(precision=7)
4 def my_func():
5 64.1992188 MiB 33.0273438 MiB import pandas
6
7 64.3125000 MiB 0.1132812 MiB df_old = pandas.DataFrame([1,2,3,4,5])
8 64.7226562 MiB 0.4101562 MiB print(df_old)
9 64.7226562 MiB 0.0000000 MiB print(id(df_old))
10 64.7226562 MiB 0.0000000 MiB df_new = df_old
11 64.7226562 MiB 0.0000000 MiB print(id(df_new), id(df_old))
12 64.7226562 MiB 0.0000000 MiB del df_old
嗯...内存增加与以前不一样...并且从一次运行到另一次运行不一致。
顺便说一句,如果您仍然怀疑结果,因为数据帧太小, df_old = pandas.DataFrame([1,2,3,4,5])
更改为df_old = pandas.DataFrame(100000*[1,2,3,4,5])
,您将看到与以前相同的结果,除了语句df_old = pandas.DataFrame(100000*[1,2,3,4,5])
占用了7 MB以上的内存空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.