我一直在尝试优化我的代码。
我比较了 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 倍