时间优化:性能,访问列表列表中的值,数组列表numpy



我一直在尝试优化我的代码。

我比较了 4 种可能的编码选择,用于获取列表列表的一个单元格中的值(或用数组替换列表(。

M = 1000
my_list = [[] for i in range(M)]
for i in range(M):
for j in range(M):
my_list[i].append(0)
my_numpy_list = [ np.full(M,1) for i in range(M) ]
time1 = time.time()
for j in range(1000):
for i in range(10000):
my_list[0][0]
print( "1  ", time.time() - time1)
time1 = time.time()
for j in range(1000):
test_list = my_list[0]
for i in range(10000):
test_list[0]
print("2 ",time.time() - time1)
for j in range(1000):
for i in range(10000):
my_numpy_list[0][0]
print("3 ", time.time() - time1)

for j in range(1000):
my_numpy_test_list = my_numpy_list[0]
for i in range(10000):
my_numpy_test_list[0]
print( "4  ", time.time() - time1)

在我的计算机上,它给出了以下时间:

1   0.9008669853210449
2  0.7616724967956543
3  2.9174351692199707
4   4.883266925811768

问题是,为什么访问 numpy 数组中的值更长?如果它更长,如何将数组转换为列表以便更快地访问数据。特别是,我非常惊讶将数组存储在列表中(情况 4(是最慢的情况。时间不是:

4 <2 <3 <1 ?

干杯

因为numpy的目标不是让你更快地访问数据。 相反,numpy 的目标是允许您编写矢量化代码并避免循环。

让我们修改您的示例,并使您的代码向列表/np.array 的每个元素添加 1

M = 1000
my_list = [[] for i in range(M)]
for i in range(M):
for j in range(M):
my_list[i].append(0)
my_numpy_array = np.array([ np.full(M,1) for i in range(M) ])
time1 = time.time()
time1 = time.time()
for j in range(1000):
test_list = my_list[0]
for i in range(10000):
test_list[0]+1
print("list case addition",time.time() - time1)
time2 = time.time()
my_numpy_list = my_numpy_array+1
print("numpy case addition",time.time() - time2)

输出为:

list case addition 0.7961978912353516
numpy case addition 0.0031096935272216797

速度快约 250 倍

相关内容

  • 没有找到相关文章

最新更新