如何向量化Numpy逐行向量二次乘积运算,优化500万行循环的运行速度
向量化实现方案
你要实现的每行独立二次型运算可以通过两种numpy原生向量化方法实现,完全替代for循环,性能可提升数百倍:
方法1:使用np.einsum(推荐,运算效率最高)
einsum可以直接指定张量运算的维度匹配规则,一步完成所有行的二次型计算:
import numpy as np # 原变量定义保持不变 wtsarray # shape(5000000,21) covmat # shape(21,21) mtx # 你的原有常数 # 向量化计算 quad = np.einsum('ij,jk,ik->i', wtsarray, covmat, wtsarray) portvol = np.sqrt(quad) * np.sqrt(mtx)
运算逻辑说明:ij,jk,ik->i 表示对每一行i,将形状为(21,)的wtsarray[i]、形状为(21,21)的covmat、形状为(21,)的wtsarray[i]做二次型运算,最终输出长度为500万的一维数组。
方法2:使用矩阵乘法+逐元素运算
如果对einsum语法不熟悉,也可以用常规矩阵运算组合实现:
# 先计算所有权重行和协方差矩阵的乘积,得到(5000000,21)的数组 cov_w = wtsarray @ covmat # 逐元素乘原权重数组后按行求和,得到每个行的二次型结果 quad = (cov_w * wtsarray).sum(axis=1) portvol = np.sqrt(quad) * np.sqrt(mtx)
性能说明
500万行数据在普通消费级CPU上运行上述向量化代码,耗时通常在1秒以内,远快于Python原生for循环的几十到上百秒耗时,且不需要额外内存开销。
问题表述优化建议
你的问题已经非常清晰:提供了输入数组的形状、可运行的原始代码、明确的优化目标,不需要额外补充信息。
内容的提问来源于stack exchange,提问作者Dazz W
相关产品推荐
相关产品推荐

