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

时间:2013-09-07 13:21:21

标签: python range itertools memorycache xrange

我正在阅读以下主题: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中,为什么要使用range创建实际列表呢? xrange( 0, len(x), 2 )不会提高内存效率吗?解决方案2的同一问题:zip创建一个实际列表。为什么不使用itertools.izip

2 个答案:

答案 0 :(得分:1)

为什么要创建具有范围的实际列表?

是的,xrange(0, len(x), 2)可以提高内存效率。

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

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

这真的有所作为吗?

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

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

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

Python 3怎么样?

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

答案 1 :(得分:0)

据我所知

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

是通常的“Pythonic”方式。在优化内容时,Python中的方法是始终分析并查看时间花费的时间。如果上述方法适用于您的应用程序,为什么要对其进行优化?