【问题标题】:How does del [dataframe] differ from `del dataframe`?del [dataframe] 与 `del dataframe` 有何不同?
【发布时间】:2022-07-07 17:28:13
【问题描述】:

我正在查看 Python 代码库的内存消耗。该代码库利用pandasnumpy 来处理庞大的数据帧。

当我们完成中间数据表示后,我们希望释放它以释放一些内存。我的一位同事注意到调用del dataframedel [[dataframe]] 之间存在差异:

他们由此得出结论 “如果del df 会和del [[df]] 做同样的事情,那么来自单元格 12 的内存应该与来自单元格 10 的内存相同,介于 12 和 14 之间,但你可以看到并不是所有的内存都被释放以再次使用。”

我同意他们对这里实践逻辑的理解。然而,当试图建立一种理论理解来支持该代码时,我找不到一个明确的解释来解释为什么会有所不同。

查看this answer,采用target_listdel 语句的定义应该使del my_listdel [my_list]/del [[my_list]]/del [[[my_list]]] 等效:

del_stmt ::=  "del" target_list

然而在this answer 中,作者使用del [[df1, df2]] 而不是del df1, df2 甚至del [df1, df2]

更糟糕的是,this answer 甚至声明相反:“如果你只是添加到列表中,它不会删除原始数据帧,当你删除列表时”,并得出结论认为人们应该更喜欢 del df1 而不是 @987654344 @。

当语言定义表明它们是相同的时,这些对del 的调用之间怎么会有区别?

【问题讨论】:

    标签: python pandas dataframe memory-management garbage-collection


    【解决方案1】:

    实际上没有任何区别。他们做同样的事情。他们甚至编译成完全相同的字节码:

    In [1]: import dis
    
    In [2]: dis.dis('del x')
      1           0 DELETE_NAME              0 (x)
                  2 LOAD_CONST               0 (None)
                  4 RETURN_VALUE
    
    In [3]: dis.dis('del [x]')
      1           0 DELETE_NAME              0 (x)
                  2 LOAD_CONST               0 (None)
                  4 RETURN_VALUE
    
    In [4]: dis.dis('del [[x]]')
      1           0 DELETE_NAME              0 (x)
                  2 LOAD_CONST               0 (None)
                  4 RETURN_VALUE
    

    您看到的结果很可能是由于执行顺序的影响。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2019-04-18
      • 1970-01-01
      • 2011-08-02
      • 2021-01-17
      • 2014-06-13
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多