【发布时间】: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