为什么NumPy数组循环运算速度慢于Python原生列表?
NumPy数组Python循环慢于列表循环的原因
- Python列表存储的是Python对象指针,循环读取
values[i]时直接返回现成的Python整型对象,除法运算直接基于Python对象规则执行,额外开销极低。 - NumPy数组底层存储的是连续的原生类型数值(本例中为int64),并非Python对象。你在Python层写for循环遍历数组元素时,每次读取元素都要将底层原生整型转换为Python整型对象,每次赋值还要将Python浮点型结果转换为原生浮点型写回数组,同时还要执行下标越界检查,这些叠加的额外开销远高于列表循环的开销,所以速度更慢。
- 你之前认知中「NumPy数组运算快于列表」的结论,前提是运算逻辑实现在C层而非Python层。uFunc速度最快就是因为整个计算过程完全在C层执行,没有Python层循环的开销,也不需要反复做类型转换,同时充分利用了连续内存的引用局部性优势,性能才会远超两种Python层循环实现。
- 额外说明:即使数组规模进一步扩大,Python层手写的NumPy循环性能依旧会低于列表循环,只有使用向量化操作、将循环逻辑交给NumPy底层C代码执行时,NumPy的性能优势才会体现。
内容的提问来源于stack exchange,提问作者Danny Han
相关产品推荐
相关产品推荐

