【Python】ある要素がList内に存在するか判定する際にSetへの変換有無による実行時間の調査

Python

概要

あるリスト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のままのほうが実行時間はよい。

コメント

タイトルとURLをコピーしました