Python可变与不可变字典内存使用

问题描述 投票:0回答:1

我无法解决这个问题,因为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.}

并使用相应的整数替换“mapping”中的所有函数值以节省空间。我有点意识到可变和不可变对象在Python中是如何工作的,我的初步结论是所有引用相同函数的值都不会导致函数的更多副本占用内存。它是否正确?

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

python python-3.x dictionary memory-management
1个回答
1
投票

Python dicts中的值始终是引用。没有必要使用中间词。 id(在CPython中)根据对象的内存地址获取一个数字。如果对象被垃圾收集,那么另一个对象可以获取该id,但是在任何给定时间,id对于一个对象是唯一的。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.