为什么我们推荐使用迭代器而不是列表(低级别说明)

时间:2015-08-31 15:28:12

标签: python list iterator

我知道这个问题在这里和外面已被问过很多次。但是,当我们拥有大型数据集时,我试图弄清楚为什么我们建议使用迭代器而不是列表。

在这个question中,人们谈论使用迭代器而不是列表但没有给出低级参数的内存和时间优势。

在接受的答案指出的mail中,写着:

  

迭代器具有很小的常量,而列表占用的空间与列表的长度成正比。不明显的部分是循环遍历迭代器再次重新使用相同的内存位置。因此,相关数据几乎总是在硬件内存缓存中。

但是为什么迭代器需要一个很小的常量,为什么迭代迭代器会再次重新使用相同的内存位置呢?

1 个答案:

答案 0 :(得分:3)

  

但是为什么迭代器需要一个很小的常量,为什么迭代迭代器会再次重新使用相同的内存位置呢?

假设您正在从文件中读取行。如果您要从文件中的所有行创建列表

lines = myfile.readlines()
for line in lines:
    ...

...这会将整个文件加载到内存中。如果文件足够大,您将消耗所有可用内存,程序将崩溃。

另一方面,如果使用迭代器:

for line in myfile:
   ...

然后Python只需要读入足够的数据来查找下一个EOL字符。只要您使用面向行的文件(例如,如果文件没有EOL字符,那么这会使用基本更少的内存,当然在这个例子中没有优势。)

例如,相同的推理适用于xrange() vs range()(其中后者返回列表,如果范围是,则会消耗大量资源大,而前者只需维持一个柜台)。