我认为大小的问题是由于
__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>>> %%timeitfor _ 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)