应使用 itertools.islice 替代列表切片进行分页遍历,因其返回惰性迭代器、零拷贝、O(1)内存;不支持负索引或步长,不可回溯,需配合 list() 按需取值。

用 itertools.islice 替代切片遍历大列表
Python 列表切片 [start:end] 会触发完整拷贝,对上百万元素的 list 做多次切片(比如分页处理),内存和时间开销陡增。真实场景里,你往往只需要逐段读取、不回溯、不随机访问——这时切片是错的抽象。
改用 itertools.islice,它返回迭代器,不复制数据,只按需推进:
from itertools import islice错误:触发拷贝,O(n) 时间 + O(n) 内存
for chunk in [data[i:i+1000] for i in range(0, len(data), 1000)]: process(chunk)
正确:零拷贝,O(1) 内存,惰性求值
it = iter(data) while True: chunk = list(islice(it, 1000)) if not chunk: break process(chunk)
-
islice不支持负索引或步长(step != 1),别硬套[::2]场景 - 如果后续还要用原数据做索引查找,别全换成
islice——它消耗迭代器,不可重用 - 在 PyPy 下,
islice的 C 层优化更明显;CPython 中优势也稳定,但别指望它加速单次小数据操作
避免在循环里反复调用 len() 或 in 查找
高频遍历中,写 for i in range(len(items)): 看似自然,但每次迭代都调用 len()(虽然 CPython 有缓存,但语义上仍是冗余);更危险的是 if x in big_list:——它是 O(n) 线性扫描,嵌套在外部循环里直接变成 O(n²)。
实际优化很简单:
立即学习“Python免费学习笔记(深入)”;
- 用
enumerate(items)替代range(len(items)),既得索引又得值,且只遍历一次 - 把
big_list转成set或frozenset(前提是元素可哈希),in操作从 O(n) 降到平均 O(1) - 若需保持插入顺序且查得快,用
dict.fromkeys(big_list).keys()构造有序去重视图(Python 3.7+ dict 有序)
注意:set 构建本身是 O(n),别在每次循环内重建;一次性构建,复用。
用生成器函数替代中间列表(尤其 map/filter 链)
写 result = list(filter(pred, map(func, data))) 是典型陷阱:三重遍历 + 两层临时列表。哪怕 data 是生成器,list() 也会强制展开全部。
iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切
直接写生成器表达式或函数,让数据流“边产边消”:
# 危险:全量加载、内存峰值高 bad = list(filter(lambda x: x > 0, map(lambda x: x * 2, huge_iterable)))安全:单次遍历,常数内存
def process_stream(source): for x in source: y = x * 2 if y > 0: yield y
good = process_stream(huge_iterable)
后续可逐个消费:next(good), 或 for z in good: ...
- 生成器函数比生成器表达式更容易调试(能加日志、断点)
- 不要在生成器里做耗时 IO 或锁操作——它会阻塞整个流水线
-
itertools.chain、itertools.compress这类工具函数返回迭代器,优先于手写循环
NumPy/Pandas 不是银弹:警惕隐式类型转换和副本
很多人一见大数据就切 NumPy,但 np.array(data) 可能悄悄把 list[dict] 或混合类型转成 object dtype,失去向量化优势;df.copy()、df['col'].apply(...) 也常触发整列副本。
关键判断点:
- 先用
df.dtypes和arr.dtype确认是否真为数值型;objectdtype 的 NumPy 数组比原生 list 还慢 - 用
df.loc[:, 'col'] = ...赋值避免SettingWithCopyWarning引发的意外副本 - 纯数值计算优先用
np.vectorize(简单函数)或numba.jit(复杂逻辑),而不是apply
真正的大规模文本或嵌套结构,Pandas 可能不如 polars 或流式 csv.DictReader + 生成器组合来得轻量可控。
性能优化最易被忽略的一点:你花半天调 islice,却忘了上游数据源本身是从磁盘逐行读的还是全 load 进内存的——IO 瓶颈永远压倒算法微调。








