numpy.linalg.solve在1.26.4与2.0.0版本间性能剧变原因问询
NumPy v2.0.0与v1.26.4中
numpy.linalg.solve的性能差异分析 性能差异现象
- 该差异在Linux、Windows系统中均存在,暂未测试macOS
- 矩阵规模不同,版本间性能表现呈现三段式反转:
- 规模≤1800x1800:v2.0.0速度显著更快,Linux平台最高快10倍,Windows平台提速更明显
- 规模1800x1800 ~ 8800x8800:v1.26.4速度更优
- 规模>8800x8800:v2.0.0再次具备性能优势
疑问
- 该性能差异是否由底层依赖库更新导致?
- 此类影响性能的修改未在官方发布说明中找到相关记录,希望明确原因
基准测试代码
使用perfplot进行性能测试,代码如下:
import matplotlib.pyplot as plt import numpy as np import perfplot def main(): plot = False if not plot: out = perfplot.bench( setup=lambda n: np.random.rand(n + 1, n), kernels=[lambda a: np.linalg.solve(a[1:], a[0])], n_range=[2**k for k in range(15)], ) np.savetxt("n.txt", out.n_range) np.savetxt(f"timings_{np.__version__.replace('.', '_')}.txt", out.timings_s) else: n = np.loadtxt("n.txt") timings_1_26_4 = np.loadtxt("timings_1_26_4.txt") timings_2_0_0 = np.loadtxt("timings_2_0_0.txt") plt.plot(n, timings_1_26_4, label="1.26.4") plt.plot(n, timings_2_0_0, label="2.0.0") plt.legend() plt.show() plt.plot(n, timings_1_26_4 / timings_2_0_0, label="1.26.4 / 2.0.0") plt.plot([0, 2**14], [1.0, 1.0]) plt.legend() plt.show() if __name__ == "__main__": main()
测试结果说明
分别在numpy1.26.4和numpy2.0.0环境下运行代码,设置plot=True生成图表:
- 整体性能对比图:横轴为线性系统未知数数量,纵轴为求解耗时(单位:秒),直观展示两个版本的耗时变化趋势
- 小范围放大图:聚焦n≤200的区间,清晰呈现小规模矩阵下的性能差异细节
- 耗时比值图:横轴为未知数数量,纵轴为v1.26.4与v2.0.0的耗时比值,水平线y=1作为性能分界(曲线在水平线上方时,v2.0.0速度更快)。其中n≈35时性能差异达到峰值,v2.0.0速度是v1.26.4的10倍
内容的提问来源于stack exchange,提问作者bluthej
相关产品推荐
相关产品推荐

