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)

运行性能对比:

image


性能差距700多倍:

image





增加10倍测试周期:

image

可以清楚的发现numpy的手动索引的速度实在是要比范围索引快的太多。


注明:


手动索引:

array[1:5]


范围索引:
array[1,2,3,4]


上面说的手动索引和范围索引有些不容易理解,这是老外的叫法,其实完全可以理解为切片和和索引号的方式。


简单来说,在numpy的索引中使用切片索引是速度最快的;而显式的给出索引号的方式是最慢的,尤其是较大规模的情况下,array[1:10000]的索引速度可能是array[list(range(1, 10000))]的几百倍。



posted on 2025-03-03 16:45  Angry_Panda  阅读(57)  评论(0)    收藏  举报

导航