显然,例如,要检查集合中的存在,使用 set 比使用 list 更有利可图,也就是说,a in [i*i for i in range(n)]
不如a in {i*i for i in range(n)}
. 但是使用发电机要优化多少a in (i*i for i in range(n))
呢?内存被保存了,还有更多?或者我不太明白如何检查生成器中是否存在元素。
显然,例如,要检查集合中的存在,使用 set 比使用 list 更有利可图,也就是说,a in [i*i for i in range(n)]
不如a in {i*i for i in range(n)}
. 但是使用发电机要优化多少a in (i*i for i in range(n))
呢?内存被保存了,还有更多?或者我不太明白如何检查生成器中是否存在元素。
理论上,如果检查将执行一次,那么最好使用生成器,因为 在这种情况下,将仅通过序列到达所需元素(或到序列末尾,如果该元素不在其中)。要创建
set
或list
解释,有必要绕过整个元素集一次,然后搜索它。如果检查将执行多次(例如,在循环中),那么最好提前创建一个现成的
set
,然后检查 this 中已经存在的元素set
。以供参考:
O(n)
)О(1)
)。但是由于 哈希表的内部结构比列表更复杂,创建集合需要更多时间。这是一个理论,在实践中,在没有先保存到变量的情况下进行搜索时,我们得到以下结果:
我们看到列表搜索结果比生成器搜索稍快。很可能是因为在生成器中获取下一个元素比在列表中花费更多的时间。
为了评估预处理搜索的实际性能,我们编写了以下程序:
使用探查器运行:
结果:
我们看到,就创建时间而言,集合 (
<setcomp>
) 的创建速度最慢,然后是生成器 (<genexpr>
),然后是列表 (<listcomp>
)。按搜索时间:最慢 - 按生成器搜索 (
in_gen
),快一点 - 按列表 (in_list
),最快 - 在集合中搜索 (in_set
)。口译员:
结果: