python – 关于内存效率:范围vs xrange,zip vs izip

我正在阅读以下主题:Make dictionary from list with python

最初的问题是将元组(1,’a’,2,’b’,3,’c’)转换为字典{1:’a’,2:’b’,3:’c’}.给出了许多有趣的解决方案,包括以下两个:

解决方案1:

dict(x[i:i+2] for i in range(0, len(x), 2))

解决方案2:

dict(zip(*[iter(val_)] * 2))

在解决方案1中,为什么还要创建具有范围的实际列表呢? xrange(0,len(x),2)不会更有内存效率吗?解决方案2的相同问题:zip创建一个实际列表.为什么不使用itertools.izip呢?

解决方法:

为什么要创建带范围的实际列表呢?

是的,xrange(0,len(x),2)的内存效率更高.

为什么不在解决方案2中使用itertools.izip()?

是的,zip()创建一个实际列表,因此您可以使用itertools.izip来节省内存.

这真的有所作为吗?

速度差异可能很小.仅当数据超出内存缓存的大小时,内存效率才能提高速度.迭代器的开销抵消了一些好处.

由于字典存储了键和值,因此元组中保存的唯一内存指向键和值.因此,在这种情况下的节省比其他迭代器应用程序要小得多,后者不会在容器中累积所有结果.

所以这很可能“无所事事”.

那么Python 3呢?

在Python 3中,range()和zip()都返回迭代器.

上一篇:适用于Python 2.x和Python 3.x的便携式内存高效范围()


下一篇:Python xrange 和range的区别