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
函数的指针将是最有效的。您能详细介绍一下您的答案吗?这是如此简短,以至于有点不清楚。虽然我认为我理解,但我希望这个答案对其他人也有用。