You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:47:26