Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python可变与不可变字典内存使用_Python_Python 3.x_Dictionary_Memory Management - Fatal编程技术网

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

Python可变与不可变字典内存使用,python,python-3.x,dictionary,memory-management,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, ...

我很难弄清楚这一点,因为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的对象是否都引用了内存中的相同位置,从而不会占用字典中的更多内存?

Python dicts中的值始终是引用。CPython中不需要中间dict.id,它根据对象的内存地址获取一个数字。如果对象被垃圾收集,那么不同的对象可能会获得该id,但在任何给定时间,一个id对于一个对象都是唯一的

可以从相同的源代码生成多个函数对象,但使用不同的词法闭包数据。闭合单元必须占用内存


早期优化是罪恶的根源。不要担心这样的细节,除非它对您的程序变得非常重要,通常是在有限的硬件上运行或使用大量对象时。另请参见,字典存储对函数对象的引用,因此函数不会重复。您在多个键下输入相同的引用,因此将获得相同的引用。您可以使用is运算符或通过比较两个项的id来轻松验证这一点。id函数告诉您对象的id,该id是否为内存位置是一个实现细节。如果两个对象具有相同的id,那么它们是相同的对象。我很难理解您关于不可变/可变的问题。只需说一句,Python变量的工作方式是相同的,无论类型如何。