NumPy 计算放大规模前,先锁定内存与数值误差
科学计算扩大输入规模时,时间不是唯一风险。临时数组、数据类型与数值误差也要随规模一起观测。
1. 计时之前先验证结果
科学计算的性能结论离不开输入规模、数据类型、机器环境和重复方式。计时前需要预热,计时后应同时观察内存分配和结果正确性。
优化前后使用同一输入生成规则与容差,并记录 dtype、数组形状和库版本。换机器或 BLAS 实现后,不直接沿用旧的耗时排名。
2. 按最小闭环验证
排障记录以最小输入、异常栈和依赖摘要为主;不记录原始数据或可识别信息。对照实现应先保证等价,再讨论向量化、编译或并行带来的差异。
先用小数组对照 NumPy 原实现与候选实现,按业务容差检查结果。通过后逐级扩大形状,同时记录峰值内存,避免只看单次计时。
3. 参考实现与图示
下面的数组示例只验证计算等价性。性能比较还需固定 dtype、数组形状、线程数和 BLAS 实现,并进行预热和多次重复。
import numpy as np values = np.arange(12, dtype=np.float64).reshape(3, 4) reference = values.sum(axis=1) candidate = np.add.reduce(values, axis=1) np.testing.assert_allclose(candidate, reference)4. 复核清单
- 优化前后结果是否在声明的误差范围内。
- 临时数组和复制是否造成峰值内存突增。
- 预热、重复次数和统计量是否写进脚本。
- 输入规模超过预算时是否分块或明确拒绝。
性能结论要带运行条件
没有形状、dtype、库版本和误差口径的“更快”,无法迁移到另一组数据。先把这些条件保存下来,再谈放大规模。