Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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_Class_Memory_Memory Management_Dictionary - Fatal编程技术网

Python 如何利用类中的变量提高内存效率?

Python 如何利用类中的变量提高内存效率?,python,class,memory,memory-management,dictionary,Python,Class,Memory,Memory Management,Dictionary,为了举例,假设我有这样一个类: def class Foo(object): def __init__(self,x): self.x = x def lookup(self): return dict[x] lookup功能的目的是在dict中查找x,并返回值。假设这张纸很大。我想知道是在类中声明dict,还是将dict声明为全局变量 我担心内存效率:dict将保持不变,我希望它不会占用比需要更多的内存。因此,我问的是类如何使用内存。如果我声明

为了举例,假设我有这样一个类:

def class Foo(object):
    def __init__(self,x):
        self.x = x
    def lookup(self):
        return dict[x]
lookup
功能的目的是在dict中查找
x
,并返回值。假设这张纸很大。我想知道是在类中声明dict,还是将dict声明为全局变量

我担心内存效率:dict将保持不变,我希望它不会占用比需要更多的内存。因此,我问的是类如何使用内存。如果我声明了例如50000个
Foo
实例,并且我在
Foo
中声明了dict,这是否意味着我正在生成50000份
Foo
?然而,如果我将dict作为一个全局变量引用,我将不会产生任何额外的副本


我如何尽可能少地复制口述?理想情况下,这个程序应该只有一个。每个对象本身都有一个dict,如果您希望提高内存效率,您可以使用一个对象来存储所有50k对象,而不是50k对象

如果您有一个数据存储对象,它以名称或可能的和索引作为
get
的参数以及
set
的值,那么您将只有一个字典来存储所有值。当然,如果在set方法中使用
setattr(self,name,value)
,它将允许您以
obj.name
的形式访问这些值-唯一的一点是python已经为您做了这些

In [4]: class DS(object):
   ...:     def __init__(self):
   ...:         pass
   ...:

In [5]: ds = DS()

In [6]: ds.a = 'A'

In [7]: ds.b = 2

In [8]: ds
Out[8]: <__main__.DS at 0x3c82db0>

In [9]: ds.a
Out[9]: 'A'

In [10]: ds.b
Out[10]: 2

In [11]: dir(ds)
Out[11]:
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'a',
 'b']
[4]中的
:类DS(对象):
…:def_uuuinit_uuu(self):
…:通过
...:
在[5]中:ds=ds()
在[6]中:ds.a='a'
在[7]中:ds.b=2
在[8]:ds中
出[8]:
在[9]中:ds.a
Out[9]:“A”
In[10]:ds.b
Out[10]:2
In[11]:dir(ds)
出[11]:
[“类”,
"德拉特",,
"dict",,
"医生",,
'格式'',
'获取属性'',
“散列”,
"初始化",,
'模块'',
"新",,
“减少”,
“uuu减少uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
"报告",,
"设置属性",,
"大小",,
"街",,
“\uuuu子类钩子”,
"weakref",,
“a”,
“b”]

在这种情况下,您应该将
dict
作为全局变量。内部变量的概念是,您可以独立地更改和使用它们,而不会产生冲突。这就是为什么
Foo
的每个实例都有它自己的dict副本(实际上命名为
self.dict
——就像您应该在
lookup
函数中使用对象的内部变量将
self.x
作为参数一样。)使用全局变量既可以节省内存,又可以防止程序中可能存在不同版本的dict

@Andreas是的,内存中的
Foo
的两个实例是不同的——但是这些对象上的方法也是不同的吗?我不明白为什么每次都会复制相同的函数(
lookup
)。只需维护一个指向
lookup
函数的指针将是最有效的。您能详细介绍一下您的答案吗?这是如此简短,以至于有点不清楚。虽然我认为我理解,但我希望这个答案对其他人也有用。