python - 向量化双 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:
语句,然后计算所有i
和j
组合,即 a matrix
,我应该能够对其进行矢量化,然后使用类似的东西np.where()
将满足if m % 2 == 0:
where要求的所有元素相加m= i+j
。
即使这不比显式 for 循环快,也应该是vectorized
因为实际上我会将数组发送到包含双 for 循环的函数,因此能够将那部分向量化,应该让我获得我所追求的速度增益,即使向量化这个双 for 循环没有。
我现在对如何广播感到困惑,但要考虑sf
因素以及m
内部循环中的因素。
解决方案
推荐阅读
- javascript - if 语句总是执行
- azure - 从具有特定范围的 Postman 调用 Azure WebApi
- r - 在 R 中实现优化的二维子集和问题
- c# - C# API 初学者
- cucumber-java - 如何将屏幕截图附加到 ExtentReport 中的每个步骤?
- python - 敌招不对,为什么?
- asp.net - ASP.NET MVC 多对多关系错误
- r - 将函数变量传递给 `inner_join()` 中的 by 选项以通过不同的列连接两个表
- javascript - VueJS:如何在 npm_modules 下注入存储和路由到组件
- javascript - 使用 puppeteer 或 playwright,有没有办法更新启动方法中最初传递的 args?