Python可变与不可变字典的内存使用情况

时间:2018-09-11 22:56:36

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

我很难弄清楚这一点,因为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的对象都指向内存中的相同位置(因此不会占用字典中的更多内存) )?

1 个答案:

答案 0 :(得分:1)

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

可以从相同的源代码生成具有不同词法闭包数据的多个函数对象。封闭细胞必须要占用记忆。


早期的优化是邪恶的根源。不必担心这样的细节,直到它对于程序真正变得重要为止,通常是在有限的硬件上运行或使用大量对象时。 (另请参见__slots__。)