始めに
最近AtCoderを始めたのですが、なかなか処理速度を考えて処理を書くまでには至らず、
書き方ごとの処理速度に関する当たりをつけるため、とりあえずよくあるリスト作成の速度を調査してみた。
検証するケース
1 - forループでinfをN個持ったリストを作成
import time
def cal_for_inf(count):
start = time.perf_counter()
inf = float('inf')
arr = [inf for i in range(count)]
end = time.perf_counter()
return end-start
2 - *でinfをN個持ったリストを作成
def cal_multi_inf(count):
start = time.perf_counter()
inf = float('inf')
arr = [inf] * count
end = time.perf_counter()
return end-start
3 - forループで0をN個持ったリストを作成
def cal_for_zero(count):
start = time.perf_counter()
arr = [0 for i in range(count)]
end = time.perf_counter()
return end-start
4 - *でinfをN個持ったリストを作成
def cal_multi_zero(count):
start = time.perf_counter()
arr = [0] * count
end = time.perf_counter()
return end-start
検証
検証したデータはpandasのDataFrameに入れて確認する
import pandas as pd
count = 1000000 ## 作成するListの要素数
data = pd.DataFrame(
[[
cal_for_inf(count),
cal_multi_inf(count),
cal_for_zero(count),
cal_multi_zero(count)
] for i in range(1,1001)],
columns=["cal_for_inf","cal_multi_inf","cal_for_zero","cal_multi_zero"]
)
検証結果
data.describe()
cal_for_inf | cal_multi_inf | cal_for_zero | cal_multi_zero | |
---|---|---|---|---|
count | 1000.000000 | 1000.000000 | 1000.000000 | 1000.000000 |
mean | 0.029765 | 0.003394 | 0.029859 | 0.003449 |
std | 0.002517 | 0.001754 | 0.002755 | 0.001216 |
min | 0.024995 | 0.002467 | 0.025293 | 0.002451 |
25% | 0.028420 | 0.002672 | 0.028401 | 0.002722 |
50% | 0.029345 | 0.002796 | 0.029270 | 0.002853 |
75% | 0.030675 | 0.003115 | 0.030712 | 0.003177 |
max | 0.060927 | 0.045249 | 0.053833 | 0.008475 |
結論
中に入れるものが一定なのであれば*で入れたほうが早い。