在 Python 中,使用字符串連接 (str1 + str2) 作為 key 和使用元組 ((str1, str2)) 作為 key 的效率差異,主要受以下因素影響:
哈希計算速度:
字符串連接 (str1 + str2):會創建一個新的字符串對象,并計算哈希值。
元組 ((str1, str2)):元組的哈希值是基于內部元素的哈希值計算的,不會創建新的字符串對象。
存儲和查找性能:
字符串連接:需要額外的內存來存儲新創建的字符串,并且哈希計算可能稍慢。
元組:由于 Python 內部對元組的哈希計算進行了優化,通常會更高效。
測試代碼:
import time
import random
import string
from pyecharts import options as opts
from pyecharts.charts import Bardef generate_random_string(length):return ''.join(random.choices(string.ascii_letters, k=length))def test_dict_key_efficiency(str_lengths, n_times=10000):results = []for length in str_lengths:str1 = generate_random_string(length)str2 = generate_random_string(length)dict_str = {}dict_tuple = {}# 測試字符串拼接作為 keystart = time.perf_counter()for _ in range(n_times):key = str1 + str2dict_str[key] = _str_time = time.perf_counter() - start# 測試元組作為 keystart = time.perf_counter()for _ in range(n_times):key = (str1, str2)dict_tuple[key] = _tuple_time = time.perf_counter() - startresults.append((length, str_time, tuple_time))return results# 設置字符串長度列表
str_lengths = [5, 10, 15, 20]
results = test_dict_key_efficiency(str_lengths)# 提取數據進行可視化
x_labels = [f"{length} chars" for length, _, _ in results]
y_str_times = [round(str_time,6) for _, str_time, _ in results]
y_tuple_times = [round(tuple_time,6) for _, _, tuple_time in results]bar = (Bar().add_xaxis(x_labels).add_yaxis("字符串拼接", y_str_times).add_yaxis("元組", y_tuple_times).set_global_opts(title_opts=opts.TitleOpts(title="字典 Key 訪問時間對比"))
)bar.render("key_efficiency_comparison.html")