Python中列表与生成器迭代速度差异的原因探究
生成器与列表迭代速度差异的原因分析
我之前了解到Python里生成器创建速度比列表快,但列表迭代速度比生成器快。但测试后结果相反:小数据量(10,000,000)下列表迭代更快,大数据量(1,000,000,000)下生成器迭代更快。测试代码及结果如下:
大数据量测试
测试代码
from time import time my_generator = (i for i in range(1_000_000_000) if i % 2 == 0) start = time() for i in my_generator: pass print("Time for Generator iteration - ", time() - start) my_list = [i for i in range(1_000_000_000) if i % 2 == 0] start = time() for i in my_list: pass print("Time for List iteration - ", time() - start)
输出结果
Time for Generator iteration - 67.49345350265503 Time for List iteration - 89.21837282180786
小数据量测试
测试代码
from time import time my_generator = (i for i in range(10_000_000) if i % 2 == 0) start = time() for i in my_generator: pass print("Time for Generator iteration - ", time() - start) my_list = [i for i in range(10_000_000) if i % 2 == 0] start = time() for i in my_list: pass print("Time for list iteration - ", time() - start)
输出结果
Time for Generator iteration - 1.0233261585235596 Time for list iteration - 0.11701655387878418
原因解析
核心差异来自内存访问效率和数据存储方式的影响:
- 小数据量场景:列表的所有元素能完全装入CPU高速缓存(L1/L2/L3),迭代时直接从缓存读取数据,速度极快;而生成器每次迭代都要实时执行判断(
i%2==0)和元素生成操作,这部分计算开销远大于缓存访问的开销,因此列表迭代更快。 - 大数据量场景:10亿级的列表会占用巨量内存(Python中单个int约占28字节,5亿个元素需约14GB内存),远超CPU缓存甚至物理内存容量,此时迭代列表会频繁触发磁盘交换(Swap)——把内存中暂不使用的数据写入硬盘,再将需要的数据读回内存,这个过程速度极慢;而生成器是按需生成元素,全程仅占用极小内存,不会触发Swap,即便每次迭代有计算开销,整体速度仍远超列表。
另外需要注意:测试中列表推导式本身的生成时间未计入迭代耗时,但这不是核心差异,内存瓶颈才是大数据量下列表迭代变慢的关键。
内容的提问来源于stack exchange,提问作者Vijeth Kashyap
相关产品推荐
相关产品推荐

