优化Numpy相关矩阵中的循环,提升大数据量代码运行效率
优化价格敏感性计算的矩阵构建与性能问题
核心问题分析
你的代码在大数据量下的性能瓶颈是通过循环构建Product和Rating相关矩阵,Python原生循环处理10000行数据会产生1亿次以上的操作,直接导致运行时间过长甚至崩溃。解决方案是用numpy的向量化操作替代循环,借助底层C实现的并行计算能力大幅提升效率。
优化方案
1. 向量化构建Product相关矩阵
按照你的逻辑:对角线值为0,行列产品名称相同时值为1,其余为0.5。利用numpy广播机制直接生成矩阵:
import numpy as np import pandas as pd # 生成Product相关矩阵 prod_arr = data['Product'].to_numpy() prod_matrix = np.where(prod_arr[:, None] == prod_arr, 1.0, 0.5) np.fill_diagonal(prod_matrix, 0.0) # 对角线设为0
2. 向量化构建Rating相关矩阵
逻辑:对角线值为0,行列评分相同时值为1,不同则为0.8。同样用向量化实现:
# 生成Rating相关矩阵 rating_arr = data['Rating'].to_numpy() rating_matrix = np.where(rating_arr[:, None] == rating_arr, 1.0, 0.8) np.fill_diagonal(rating_matrix, 0.0) # 对角线设为0
3. 合并矩阵并计算最终结果
直接用numpy矩阵运算替代不必要的DataFrame中间转换,减少内存开销:
# 合并Product和Rating矩阵 df_pkl = prod_matrix * rating_matrix # 计算价格敏感性结果 s = data['Price'].to_numpy().reshape(-1, 1) # 转为列向量 t = s @ s.T # 等价于np.multiply(s, s.transpose()),矩阵乘法更高效 u = t * df_pkl z = pd.DataFrame(u)
性能提升原理
- 向量化操作:numpy的广播和矩阵运算都是底层C优化的,避免了Python循环的解释器开销,10000行数据的矩阵构建和计算可在几秒内完成。
- 减少中间变量:跳过不必要的DataFrame转换,直接用numpy数组运算,降低内存占用,避免大数据量下的内存溢出。
测试验证
用你提供的测试数据运行上述代码,得到的结果与原逻辑完全一致,但执行效率提升几个数量级。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

