リストへのアクセス回数について

リストへのアクセス回数が多いほど遅くなるのは当然だけど実際どれくらい変わるのかってお話

  • リストへのfor文でリスト内のみを回すとき
  • リスト内を描画する場合
  • リスト内をprintしていくとき

今回はfor文を回すときに一回変数に入れるとき (A) と入れないとき (B) で比較をしています。

平均値を出すために3連、それぞれの場合を交互に行っています(最後のみ1回)

 

リストへのfor文でリスト内のみを回すとき

結果

0.01800823211669922[sec]
0.017997026443481445[sec]
0.018002748489379883[sec]
average_A:0.018002669016520183[sec]
variance_A:3.139651501745296e-11[sec^2]
0.017003297805786133[sec]
0.017001628875732422[sec]
0.017006874084472656[sec]
average_B:0.017003933588663738[sec]
variance_B:7.181218582748746e-12[sec^2]

一回変数に入れたほうが遅い。

 

import matplotlib.pyplot as plt
import time
from statistics import variance

x = [[i, i] for i in range(100000)]

start = time.time() #計測開始
for i in range(100000):
xi = x[i]
x0, x1 = xi[0], xi[1]
end_A_1 = time.time() - start #計測終了

start = time.time() #計測開始
for i in range(100000):
x0, x1 = x[i][0], x[i][1]
end_B_1 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100000):
xi = x[i]
x0, x1 = xi[0], xi[1]
end_A_2 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100000):
x0, x1 = x[i][0], x[i][1]
end_B_2 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100000):
xi = x[i]
x0, x1 = xi[0], xi[1]
end_A_3 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100000):
x0, x1 = x[i][0], x[i][1]
end_B_3 = time.time() - start #計測終了


print("{0}".format(end_A_1) + "[sec]")
print("{0}".format(end_A_2) + "[sec]")
print("{0}".format(end_A_3) + "[sec]")
average_A = (end_A_1+end_A_2+end_A_3)/3
variance_A = variance([end_A_1, end_A_2, end_A_3])
print("average_A:{0}".format(average_A) + "[sec]")
print("variance_A:{0}".format(variance_A) + "[sec^2]")

print("{0}".format(end_B_1) + "[sec]")
print("{0}".format(end_B_2) + "[sec]")
print("{0}".format(end_B_3) + "[sec]")
average_B= (end_B_1 + end_B_2 + end_B_3)/3
variance_B = variance([end_B_1, end_B_2, end_B_3])
print("average_B:{0}".format(average_B) + "[sec]")
print("variance_B:{0}".format(variance_B) + "[sec^2]")

 

 

リスト内を描画する場合

結果

0.20206260681152344[sec]
0.2369992733001709[sec]
0.21895718574523926[sec]
average_A:0.21933968861897787[sec]
variance_A:0.00030525239767105933[sec^2]
0.20597147941589355[sec]
0.2080094814300537[sec]
0.21503877639770508[sec]
average_B:0.20967324574788412[sec]
variance_B:2.263005241805634e-05[sec^2]

一回変数に入れたほうが早い(場合もある)

 


import matplotlib.pyplot as plt
import time
from statistics import variance

x = [[i, i] for i in range(100)]

start = time.time() #計測開始
for i in range(100):
xi = x[i]
plt.plot(xi[0], xi[1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_A_1 = time.time() - start #計測終了

start = time.time() #計測開始
for i in range(100):
plt.plot(x[i][0], x[i][1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_B_1 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100):
xi = x[i]
plt.plot(xi[0], xi[1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_A_2 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100):
plt.plot(x[i][0], x[i][1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_B_2 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100):
xi = x[i]
plt.plot(xi[0], xi[1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_A_3 = time.time() - start #計測終了


start = time.time() #計測開始
for i in range(100):
plt.plot(x[i][0], x[i][1], marker = ".", color = "blue")
plt.xlim(-1, 100)
plt.ylim(-1, 100)
plt.show()
end_B_3 = time.time() - start #計測終了


print("{0}".format(end_A_1) + "[sec]")
print("{0}".format(end_A_2) + "[sec]")
print("{0}".format(end_A_3) + "[sec]")
average_A = (end_A_1+end_A_2+end_A_3)/3
variance_A = variance([end_A_1, end_A_2, end_A_3])
print("average_A:{0}".format(average_A) + "[sec]")
print("variance_A:{0}".format(variance_A) + "[sec^2]")

print("{0}".format(end_B_1) + "[sec]")
print("{0}".format(end_B_2) + "[sec]")
print("{0}".format(end_B_3) + "[sec]")
average_B= (end_B_1 + end_B_2 + end_B_3)/3
variance_B = variance([end_B_1, end_B_2, end_B_3])
print("average_B:{0}".format(average_B) + "[sec]")
print("variance_B:{0}".format(variance_B) + "[sec^2]")

 

 

import time
x = [[i, i] for i in range(100000)]
start = time.time() #計測開始
for i in range(100000):
print(x[i])
end_A_1 = time.time() - start #計測終了


start = time.time() #計測開始
for i in x:
print(i)
end_B_1 = time.time() - start #計測終了
print("{0}".format(end_A_1) + "[sec]")
print("{0}".format(end_B_1) + "[sec]")

 

リスト内をprintしていくとき

数字からリストにアクセスするのと直接アクセスする場合

for i in range(100000):

for i in x:

 

結果

7.7575836181640625[sec]
7.87708592414856[sec]

 


import time
x = [[i, i] for i in range(100000)]
start = time.time() #計測開始
for i in range(100000):
print(x[i])
end_A_1 = time.time() - start #計測終了


start = time.time() #計測開始
for i in x:
print(i)
end_B_1 = time.time() - start #計測終了
print("{0}".format(end_A_1) + "[sec]")
print("{0}".format(end_B_1) + "[sec]")

 

なんとなく思うこと

リストへのアクセス回数が増える場合には一度変数にした方がよい?

逆にリストを回すだけだとAが早いのが意外