在列表推导式内声明集合为何远慢于提前声明?(Python 3.9.13)
为什么提前声明集合比在列表推导式内声明快几个数量级?
核心原因是重复创建集合的巨大开销,两种写法的执行逻辑完全不同:
第一种写法中,
b = set(b)只执行一次,把列表b转换为集合后,后续列表推导式里的x in b都是O(1)的高效集合查找。总开销是「1次集合转换(O(m),m是b的长度8000) + 10000次O(1)查找」,整体时间复杂度是O(m + n)。第二种写法里,
set(b)被放在了列表推导式的if条件中,这意味着遍历a的每一个元素时,都会重新把列表b转换成集合一次。a有10000个元素,就等于执行了10000次set(b)操作。每次集合转换的开销是O(m),总时间复杂度直接变成O(nm)=100008000,这两种时间复杂度的差距直接导致了性能差几个数量级。
你可以做个验证:如果把第二种写法改成只创建一次集合,耗时会和第一种几乎一致:
t = time.time() b_set = set(b) [x for x in a if x in b_set] print(time.time() - t)
内容的提问来源于stack exchange,提问作者Ludvig J.
相关产品推荐
相关产品推荐

