如何高效过滤大型Python列表?优化循环内过滤性能方案咨询
高效过滤大型数组的优化方案
一、提前构建索引字典(最优方案)
由于你需要多次针对不同listingID重复执行过滤,最核心的优化思路是一次性预处理数组,按第14列的值构建映射索引。后续查询直接从索引中取值,将每次查询的时间复杂度从O(n)降到O(1),彻底解决循环内的性能瓶颈。
代码示例:
from collections import defaultdict # 仅需执行一次的预处理:构建listingID到对应行的映射 listing_index = defaultdict(list) for row in allListings: key = row[14] listing_index[key].append(row) # 后续循环中直接查询,无需再遍历整个数组 tempRows = listing_index.get(listingID, [])
这个方案只需要遍历一次allListings,之后所有查询都是直接字典查找,能把循环内的时间占比降到几乎为0。
二、无法预处理时的替代方案
如果allListings是动态更新的,没法提前建索引,可以用列表推导式替代filter+lambda——列表推导式在Python中避免了lambda函数调用的额外开销,执行效率通常比filter+lambda高10%-30%:
tempRows = [row for row in allListings if row[14] == listingID]
三、数值型数组用numpy加速
如果allListings的元素都是数值类型,可以转换为numpy数组,利用其C级别的矢量化操作大幅提升速度:
import numpy as np # 转换为numpy数组 np_listings = np.array(allListings) # 预处理构建索引(同样适合多次查询) unique_ids, indices = np.unique(np_listings[:, 14], return_inverse=True) id_to_rows = {uid: np_listings[indices == i] for i, uid in enumerate(unique_ids)} # 后续查询,转回列表格式(如果需要) tempRows = id_to_rows.get(listingID, np.array([])).tolist()
内容的提问来源于stack exchange,提问作者Francis111333
相关产品推荐
相关产品推荐

