【问题标题】:Cleaning unused function variables or args for Python 3 [duplicate]为 Python 3 清理未使用的函数变量或参数 [重复]
【发布时间】:2018-07-12 15:57:56
【问题描述】:

假设我有以下功能(只是一个例子):

a = ['apple', 'mango', 'kiwi']
b = ['apple']

def random_fucnction(a, b):
    len_a = len(a)
    len_b = len(b)

    combined_len = len_a+len_b
    diifrence = list(set(a)-set(b))


    return diifrence, combined_len

为了减少内存,我通常在函数末尾使用del

def random_fucnction(a, b):
    len_a = len(a)
    len_b = len(b)

    combined_len = len_a+len_b
    diifrence = list(set(a)-set(b))

    del len_a, len_b
    return diifrence, combined_len

有没有自动找出未使用的变量并在函数中删除它们的方法?

【问题讨论】:

  • 我不确定未使用的变量,但您可以在删除它们后强制垃圾收集器:import gc; gc.collect()
  • 我认为您需要阅读更多有关范围的信息。当函数结束时,all 你的局部变量被删除。此外,删除变量并不一定会删除它绑定的对象,只是删除一个特定的名称。
  • Here 是一篇关于python垃圾收集的好文章,包括gc模块的使用。
  • @AndrejKesely, ...虽然没有太多意义——它们已经未被引用,所以额外的 GC 调用只是增加了尝试更快释放内存的开销;无论如何,它最终会发生(以更大、更高效的批次)。
  • 另外,在 CPython 中,由于这些值不涉及循环,gc.collect() 甚至不会尽快清理它们。如果它们已经是垃圾,它们已经被收集了;如果它们还没有被收集,它们就不是垃圾,所以它不能收集它们。即使你有一个循环,你要做的就是手动打破它,比如a.bval=None,然后ab会在删除时立即收集,无需调用collect

标签: python python-3.x


【解决方案1】:

自动的方法是什么都不做。

局部变量(包括参数)在函数结束时超出范围。这与您的del 具有完全相同的效果,因此您没有做任何有用的事情。


至于内存使用:Python 会自动进行垃圾回收。如果您的变量是对某个值的唯一引用,那么一旦该变量被删除或超出范围,它就会变成垃圾。

在 CPython 中,收集主要是通过引用计数来完成的。这意味着该值被销毁,并且一旦成为垃圾,内存就会返回到空闲列表中——除非该值涉及到引用循环,在这种情况下,它不会被销毁,直到循环收集器的下一次运行。

对于大多数其他 Python 实现,有一个更复杂的垃圾收集器,它不会发现垃圾并将其销毁,直到在不久的将来更难预测时间。

但不管怎样,del 不会改变任何东西。您仍然只是删除变量,这间接地使值垃圾并因此可收集;你没有对价值本身做任何事情。

【讨论】:

  • @MadPhysicist 不,不是。如答案中所述,实现细节是是否立即收集垃圾。无论哪种方式,它都会立即变成垃圾。
  • 对不起。我将“垃圾”误读为“收集的垃圾”。你完全正确。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多