【问题标题】:Python mutable vs immutable dictionary memory usagePython 可变与不可变字典内存使用情况
【发布时间】:2018-09-11 22:56:35
【问题描述】:

我无法弄清楚这一点,因为 Python 的 getsizeof() 不会返回字典所指对象的内存消耗。

如果我有一些可以根据给定输入调用的函数:

def foo(x):
    mapping = {'a':func1,
               'b':func1,
               'c':func2,
               'd':func2,
               'e':func2,
               'f':func3,
               ...etc.}

    return mapping[x]()

并且某些输入导致调用相同的函数,是否存储该函数的多个副本(或者它是引用?)会导致更大的内存占用?

我正在尝试确定创建一个只存储一个函数副本的中间字典是否会更节省内存:

functions = {0:func1,
             1:func2,
             2:func3,
             ...etc.}

并将“映射”中的所有函数值替换为相应的整数以节省空间。我有点了解可变对象和不可变对象在 Python 中是如何工作的,我最初的结论是,引用同一函数的所有值不会导致函数的更多副本占用内存。这是正确的吗?

在一个有点相关的问题中,如果我要打印出一个对象 id,使用 id(),是否所有具有相同 id 的对象都引用内存中的相同位置(因此不会占用字典中的更多内存)?

【问题讨论】:

  • 字典存储对函数对象的引用,因此函数不会重复。您将相同的引用放在多个键下,因此您将获得相同的引用。 (您可以使用is 运算符或通过比较两个项目的id() 轻松验证这一点。)
  • id 函数告诉你对象的id,这是否是一个内存位置是一个实现细节。如果两个对象具有相同的id,那么它们是相同的对象
  • 我很难理解您关于不可变/可变的问题。可以说,无论类型如何,Python 变量的工作方式都是一样的。

标签: python python-3.x dictionary memory-management


【解决方案1】:

Python dicts 中的值总是引用。不需要中间字典。 id(在 CPython 中)根据对象的内存地址获取一个数字。如果对象被垃圾回收,那么另一个对象可能会获取该 id,但在任何给定时间,一个 id 对一个对象都是唯一的。

可以从相同的源代码生成多个函数对象,但具有不同的词法闭包数据。闭合单元确实需要占用内存。


早期优化是万恶之源。在它对你的程序真正变得重要之前,不要担心这样的细节,通常是在有限的硬件上运行或使用大量对象时。 (另请参阅__slots__。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2013-01-26
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多