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

4
我正在阅读以下主题:使用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呢?

9
这取决于Python版本。在Python 3中,range是一个生成器(Python 2中的rangexrange替代)。同样地,在Python 3中,zip也是一个生成器。 - Yuushi
2个回答

2

为什么要用range创建实际列表?

是的,xrange(0, len(x), 2)更节省内存。

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

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

这真的有区别吗?

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

由于字典存储键和值,因此只有指向键和值的元组中节省了内存。因此,在其他不将所有结果累积在容器中的迭代器应用程序中,这种情况下的节省更加适度。

所以这一切都可能是“无事生非”。

Python 3呢?

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


0
据我所知
dict(zip(*[iter(val_)] * 2))

这是通常的“Pythonic”方式。在Python中,当涉及到优化时,我们的方法是始终进行性能分析并查看时间花费在哪里。如果上述方法对您的应用程序有效,则为什么要进行优化呢?


“这是通常的“Pythonic”方式。”我强烈不同意。这是一个不太可读的版本:iterable = iter(val_); dict(zip(iterable, iterable)),而且这也不太直观。 - Bakuriu
我看到很多有函数式编程背景的人在使用Python时经常使用这个。 - Hrishi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接