概要
あるリストLがあるときにLにxが含まれるかを知りたいときに、z in L と x in set(L) のどちらが実行時間が速いか調査する。
計測
from time import perf_counter_ns
def perf_time(func):
def wrapper(*args, **kwargs):
start = perf_counter_ns()
result = func(*args, **kwargs)
end = perf_counter_ns()
elapsed = end - start
return elapsed, result
return wrapper
@perf_time
def search(l, target: int):
return target in l
@perf_time
def search_convert_to_set(l, target: int):
s = set(l)
return target in s
import random
from numpy import average
size_list = [10 ** i for i in range(1, 8)]
measure_count = 5
l_result = []
cs_result = []
s_result = []
for size in size_list:
l_time = []
cs_time = []
s_time = []
for _ in range(measure_count):
target = random.randint(0, size)
l = [random.randint(0, size) for _ in range(size)]
l_time.append(search(l, target)[0])
cs_time.append(search_convert_to_set(l, target)[0])
s = set(l)
s_time.append(search(s, target)[0])
l_result.append(average(l_time))
cs_result.append(average(cs_time))
s_result.append(average(s_time))
import matplotlib.pyplot as plt
plt.plot(size_list, l_result, c="red", label="target in list", marker="o")
plt.plot(size_list, cs_result, c="blue", label="target in set(list)", marker="^")
plt.plot(size_list, s_result, c="green", label="target in set", marker="x")
plt.xlabel("List Size")
plt.ylabel("Time [ns]")
plt.legend(loc="upper left")
plt.xscale("log")
plt.yscale("log")
plt.show()

結果
わざわざListをSetに変換するよりListのままのほうが実行時間はよい。
コメント