首页 > 解决方案 > 向量化双 for 循环

问题描述

这是一个性能问题。我正在尝试优化以下双 for 循环。这是一个 MWE

import numpy as np 
from timeit import default_timer as tm

# L1 and L2 will range from 0 to 3 typically, sometimes up to 5
# all of the following are dummy values but match correct `type`
L1, L2, x1, x2, fac = 2, 3, 2.0, 4.5, 2.3
saved_values = np.random.uniform(high=75.0, size=[max(L1,L2) + 1, max(L1,L2) + 1]) 
facts = np.random.uniform(high=65.0, size=[L1 + L2 + 1])
val = 0

start = tm()

for i in range(L1+1):
    sf = saved_values[L1][i] * x1 ** (L1 - i)
    for j in range(L2 + 1):
        m = i + j
        if m % 2 == 0:
            num = sf * facts[m] / (2 * fac) ** (m / 2)
            val += saved_values[L2][j] * x1 ** (L1 - j) * num

end = tm()
time = end-start

print("Long way: time taken was {} and value is {}".format(time, val))

我对解决方案的想法是取出if m % 2 == 0:语句,然后计算所有ij组合,即 a matrix,我应该能够对其进行矢量化,然后使用类似的东西np.where()将满足if m % 2 == 0:where要求的所有元素相加m= i+j

即使这不比显式 for 循环快,也应该是vectorized因为实际上我会将数组发送到包含双 for 循环的函数,因此能够将那部分向量化,应该让我获得我所追求的速度增益,即使向量化这个双 for 循环没有。

我现在对如何广播感到困惑,但要考虑sf因素以及m内部循环中的因素。

标签: pythonnumpy

解决方案


推荐阅读