Set初始化开销极小,性能关键在数据规模与元素特性;字面量{s}和set()最快,避免set([x])冗余;Python中set(iterable)比list慢15–25%,Java中HashSet添加10万整数需12–17ms。

Set 集合初始化本身开销极小,真正影响性能的是初始化时传入的数据规模和元素类型——尤其是是否需去重、是否可哈希、是否已存在重复。
直接字面量初始化最快
空集合或少量确定元素,用花括号最轻量:
-
s = {1, 2, 3}:Python 解释器在编译期就能构造常量集合,无运行时循环或哈希计算 -
s = set():创建空对象,也几乎无开销 - 避免写
s = set([1, 2, 3])—— 多一次列表构造 + 迭代 + 哈希插入,纯属冗余
从列表转 set 的代价取决于原始数据
初始化如 s = set(lst) 的耗时主要来自两部分:遍历原容器 + 对每个元素做哈希与冲突处理。
- 若
lst含 10 万个整数且无重复:约 0.8–1.2 ms(主流 Python 3.11+) - 若含大量重复(如 10 万次添加同一值):实际只插入 1 次,但仍要遍历全部 10 万次,耗时接近前者
- 若元素不可哈希(如含列表、字典):初始化直接抛
TypeError,不进入性能比拼环节
与其他集合初始化方式横向看
同规模数据下,初始化阶段的相对速度(快 → 慢)大致为:
-
{1,2,3}(set 字面量)≈[](list 字面量)≈{}(dict 字面量) -
set()≈dict()≈list()(空构造) -
set(iterable)比list(iterable)略慢 —— 因需额外计算 hash 并检查重复 -
set(range(100000))比list(range(100000))慢约 15–25%,主因是哈希表扩容策略更保守
Java 中 Set 初始化的典型表现
以添加 10 万个整数为例(JDK 17+,HotSpot):
-
new HashSet()+ 循环 add:约 12–17 ms -
new LinkedHashSet()+ 循环 add:约 15–20 ms(链表维护带来小幅开销) -
new TreeSet()+ 循环 add:约 35–45 ms(红黑树每次插入需平衡,O(log n) 累积) - 注意:Java 中没有类似 Python 的字面量批量初始化语法,所以“初始化即填充”必然涉及循环


















