我是 python 和编码的新手,我正在编写这个脚本,我想在两个非常长的列表中获得交集(匹配的项目),每个列表超过 200000 个项目。我使用了两个 for 循环,如下所示:
for x in list1:
for y in list2:
print(y)
但是运行了一个多小时才得到想要的结果。 我想到了将这两个列表变成集合,然后对它们使用交集操作数 &,它完美地工作,运行时间减少到只有三秒。
我的问题是:这怎么可能?这些操作数如何运行得如此之快?他们不需要遍历两组中的所有项目吗?
请您参考如下方法:
评论中的人提到,作为一种数据结构,对于某些类型的操作,集合比列表更好,包括检查集合成员资格。检查一个集合的成员是 O(1),这意味着它花费的时间与集合有多少元素无关。检查列表的成员资格是 O(n),与元素的数量成线性比例关系。 The Big O Cheatsheet是选择数据结构的一个很好的引用。
您的代码可能很慢的另一个原因是您的交集是使用 Python for 循环完成的,这些循环被解释,每个步骤都按照编写的方式执行*。当您调用 set.intersection 时,这是由解释器的内置集合实现处理的,在 CPython 中是 written in C ,并编译成机器码。这意味着此 C 实现中使用的 for 循环比您用 Python 编写的循环快得多,并且还为 C 编译器提供了应用额外优化的机会,而这对于解释型代码来说是不可能的。
* 我不确定 Python 的 for 循环体是否被转换为优化的中间表示,尽管这样的 IR 无法与 C 优化相媲美,尤其是当您的循环不是引用透明的时候。
