python性能优化:numpy的手动索引比numpy的范围索引要快近千倍速度
最近看代码看到这么一个说法:
# numpy doesn't special case range indexing, so it's very slow.
# Slice manually instead, which is faster than any other method.
# NumPy 未对范围索引进行特殊优化,因此速度非常慢。
# 建议改为手动切片,这比其他任何方法都更快。
测试代码:
import numpy as np
import time
x=np.arange(1000000)
s=range(10000, 100000)
a=time.time()
for _ in range(100):
x[10000:100000] = 1
y = x[10000:100000]
# print(y)
b=time.time()
print(b-a)
a=time.time()
for _ in range(100):
x[s] = 1
y = x[s]
b=time.time()
print(b-a)
运行性能对比:

性能差距700多倍:

增加10倍测试周期:

可以清楚的发现numpy的手动索引的速度实在是要比范围索引快的太多。
注明:
手动索引:
array[1:5]
范围索引:
array[1,2,3,4]
上面说的手动索引和范围索引有些不容易理解,这是老外的叫法,其实完全可以理解为切片和和索引号的方式。
简单来说,在numpy的索引中使用切片索引是速度最快的;而显式的给出索引号的方式是最慢的,尤其是较大规模的情况下,array[1:10000]的索引速度可能是array[list(range(1, 10000))]的几百倍。
本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-03-03 16:45 Angry_Panda 阅读(57) 评论(0) 收藏 举报
浙公网安备 33010602011771号