Skip to main content
 首页 » 编程设计

python之如何加速 Python 中的嵌套 for 循环

2025年05月04日27sxdcgaq8080

我有以下 Python 2.7 代码:

listOfLists = [] 
for l1_index, l1 in enumerate(L1): 
    list = [] 
    for l2 in L2: 
        for l3_index,l3 in enumerate(L3): 
            if (L4[l2-1] == l3): 
                value = L5[l2-1] * l1[l3_index] 
                list.append(value) 
                break 
    listOfLists.append(list) 

L1、L2、L3、L4、L5 列表为:

L1 = [[0.60, 0.95, 0.38, 1.02, 0.29, 0.43], [0.40, 0.09, 0.87, 0.85, 0.70, 0.46], [0.67, 0.91, 0.66, 0.79, 0.86, 0.06], [0.59, 1.81, 0.05, 1.88, 0.20, 0.48], [0.64, 0.34, 0.37, 1.39, 0.56, 0.27], [0.56, 0.34, 0.68, 2.79, 0.18, 0.42], [0.42, 1.67, 0.04, 0.44, 0.25, 0.94], [0.32, 1.92, 0.95, 2.85, 0.95, 0.96], [0.50, 0.68, 0.84, 1.79, 0.35, 0.09], [0.34, 0.66, 0.85, 0.35, 0.38, 0.59], [0.50, 0.79, 0.45, 2.93, 0.50, 0.92], [0.11, 0.11, 0.93, 1.11, 0.81, 0.49]]  # a list of 12 sublists 
L2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
L3 = [480, 120, 35, 0, 520, 300] 
L4 = [120, 120, 120, 0, 300, 35, 35, 520, 300, 480, 120, 480, 0, 35, 0, 0, 300] 
L5 = [5.4, 2.83, 1.16, 6.9, 0.76, 2.15, 5.61, 3.12, 1.57, 0.08, 5.36, 0.2, 1.2, 1.4, 2.9, 2.1, 3.5] 

这些只是例子;实际上,列表包含数十万个数字。解释器需要数十秒来计算三个嵌套的 for 循环。

是否有可能以某种方式加速此代码,例如使用 itertools 或任何其他模块/函数?

编辑:我不能使用非标准的 python 2.7 模块(numpy、scipy ...)

请您参考如下方法:

既然你说可读性并不重要,只要它能加速代码,这就是你的技巧:

[[L5[l2 - 1] * sl1 for sl1, l3 in zip(l1, L3) 
     for l2 in L2 if L4[l2 - 1] == l3] 
 for l1 in L1] 

此代码比 for 循环快 25%。但相信我,无论谁在我的代码中写了这个,我都会开枪打死他。