如何优化Python嵌套循环代码,将执行时间降至0.02秒以内?
Python代码加速优化方案
针对你提供的代码(处理11万个子列表,每个约10个元素,当前耗时0.221秒,目标无Cython下降至0.02秒内),可以通过消除Python层级循环开销、利用内置优化函数或向量化计算来实现,以下是几种高效方案:
方案1:切片拆分+math.prod(Python3.8+)
直接通过切片拆分奇偶位置元素,用C实现的math.prod计算乘积,彻底替代内层while循环:
import math result = [] for lst in some_list_of_lists: # 拆分出索引0,2,4...的元素(t1的因子)和索引1,3,5...的元素(t2的因子) odds = lst[::2] evens = lst[1::2] t1 = math.prod(odds) t2 = math.prod(evens) if t1 > t2: result.append(lst)
优势:切片和math.prod均为底层优化操作,比手动循环快数倍,代码简洁易读。
方案2:reduce+operator.mul(兼容Python3.8以下)
如果无法使用math.prod,用functools.reduce结合operator.mul实现高效乘积计算:
from functools import reduce import operator result = [] for lst in some_list_of_lists: t1 = reduce(operator.mul, lst[::2], 1) t2 = reduce(operator.mul, lst[1::2], 1) if t1 > t2: result.append(lst)
优势:同样避免了手动循环的开销,兼容旧版本Python。
方案3:numpy向量化批量计算(最快方案)
若所有子列表长度一致(均为10个元素),用numpy将整个数据集转为二维数组,批量计算乘积:
import numpy as np # 转换为numpy数组(指定int64避免溢出) arr = np.array(some_list_of_lists, dtype=np.int64) # 按行计算奇数列、偶数列的乘积 t1 = arr[:, ::2].prod(axis=1) t2 = arr[:, 1::2].prod(axis=1) # 筛选符合条件的子列表并转回原生列表 result = arr[t1 > t2].tolist()
优势:numpy的向量化操作完全基于C实现,计算效率接近Cython,能轻松将耗时压到0.02秒以内。
内容的提问来源于stack exchange,提问作者40k-btc
相关产品推荐
相关产品推荐

