Python手动求和、内置sum与numpy.sum性能差异探究
为什么纯Python循环求和比内置sum和numpy.sum更快?
你的测试结果看似反直觉,但其实是不同实现的迭代开销和numpy的适用场景导致的,具体原因如下:
1. 为什么with_sum比basic慢?
内置sum确实是C实现,但你传入的是生成器表达式(1/i for i in range(1, n+1))。生成器每次迭代都需要在Python层面执行1/i的计算,还要调用生成器的__next__方法,这些额外的Python层面操作开销,抵消了sum本身的C级求和优势。
而basic里的纯Python for循环,虽然是Python字节码执行,但操作非常简单:每次循环直接计算1/i并累加,没有生成器迭代的额外调用开销,整体效率反而更高。
2. 为什么with_numpy_sum最慢?
numpy的np.sum的性能优势完全建立在处理numpy数组的向量化运算上,而你传入的是Python生成器。此时numpy无法发挥向量化的优势,反而需要逐个迭代生成器的元素,还要频繁在Python浮点数和numpy内部数值类型之间做转换,加上numpy函数本身的初始化开销,导致整体速度比纯Python循环还慢。
如果要让numpy发挥优势,应该先创建numpy数组再做运算,比如:
import numpy as np import math def optimized_numpy_sum(n): arr = np.arange(1, n+1, dtype=np.float64) s = np.sum(1 / arr) return s - math.log(n) - 0.577215664901532861
这个版本利用numpy的向量化C循环,会比basic快得多。
总结
- 内置
sum的C优势体现在处理已有的序列(比如列表),面对生成器时,迭代开销会拖慢速度; - numpy的优化只针对数组的批量操作,不要用它处理Python迭代器/生成器;
- 纯Python循环在这种简单、无额外开销的场景下,反而能获得不错的性能。
内容的提问来源于stack exchange,提问作者MathTolliob
相关产品推荐
相关产品推荐

