为何Python内置sum与numpy.sum对numpy数组求和结果不同?numpy.sum如何实现?
Python内置sum与numpy.sum对numpy数组求和结果不同的原因及numpy.sum实现原理
测试场景与结果
测试代码如下:
import numpy as np test = [.1]*10 test = [np.float64(x) for x in test] test[5]= np.float64(-.9) d = [np.asarray(test) for x in range(0,60000)]
两种求和方式的输出差异:
- 调用Python内置
sum(sum(d))的结果:np.float64(-1.7473212210461497e-08) - 调用
np.sum(d)的结果:np.float64(9.987344284922983e-12)
结果差异的核心原因
两者结果不同的本质是求和算法的差异,结合浮点数本身的精度特性,导致误差累积程度不同:
Python内置sum的顺序累加逻辑
Python的sum采用简单的顺序累加方式:先逐个累加每个子数组的元素得到子数组的和,再逐个累加所有子数组的结果。由于0.1无法用二进制浮点数精确表示,单个子数组的求和结果就存在微小舍入误差,60000次累加后,误差会被不断放大,最终呈现出较大的偏差。numpy.sum的精度优化累加逻辑
numpy.sum默认使用**成对累加(Pairwise Summation)**算法:将数组递归地分成两半分别求和,再将结果相加。这种方式能让浮点数的舍入误差尽可能相互抵消,大幅降低误差累积的程度。同时numpy会利用底层硬件和优化库的支持,进一步提升精度控制的效率。
numpy.sum的实现逻辑
numpy.sum的实现核心流程如下:
- 输入统一:自动将输入的可迭代对象(如列表)转换为numpy数组,确保数据类型一致。
- 算法选择:根据数组的规模和维度选择合适的求和策略——小型数组可能直接顺序累加,大型数组则启用成对累加或分块累加优化。
- 底层优化:通过C语言实现核心计算逻辑,结合SIMD等硬件指令提升计算速度,同时针对不同浮点数类型(float32/float64)设计对应的精度处理逻辑。
- 维度处理:支持多维数组的轴向求和,内部会将多维求和拆解为高效的一维求和操作。
内容的提问来源于stack exchange,提问作者Liam385
相关产品推荐
相关产品推荐

