我认为大小的问题是由于__sizeof__
在Python 2.X的实现中OrderedDict
没有定义方法的事实,所以它只是退回到dict的__sizeof__
方法。
为了在这里证明这一点,我在这里创建了一个A
扩展的类,list
并且还添加了一个额外的方法foo
来检查是否影响大小。
class A(list):
def __getitem__(self, k):
return list.__getitem__(self, k)
def foo(self):
print 'abcde'
>>> a = A(range(1000))
>>> b = list(range(1000))
但仍返回相同的大小sys.getsizeof
:
>>> sys.getsizeof(a), sys.getsizeof(b)
(9120, 9120)
当然A
会很慢,因为它的方法在Python中运行,而list的方法将在纯C中运行。
>>> %%timeit
... for _ in xrange(1000):
... a[_]
...
1000 loops, best of 3: 449 µs per loop
>>> %%timeit
for _ in xrange(1000):
b[_]
...
10000 loops, best of 3: 52 µs per loop
这似乎在Python 3中已得到修复,该Python 3中现在有一个定义明确的__sizeof__
方法:
def __sizeof__(self):
sizeof = _sys.getsizeof
n = len(self) + 1 # number of links including root
size = sizeof(self.__dict__) # instance dictionary
size += sizeof(self.__map) * 2 # internal dict and inherited dict
size += sizeof(self.__hardroot) * n # link objects
size += sizeof(self.__root) * n # proxy objects
return size