设置理解VS For循环VS设置差异



我正在开发一个用Python编写的3SAT求解器。我正在浏览一个列表列表(在以下示例中称为my_list(。我还有一个集合checked,它存储了my_list中在浏览列表时不应该检查的元素的索引。你认为以下哪一项会更快?

选项A(

to_be_checked = {i for i in range(len(my_list)) if i not in checked}
for i in to_be_checked:
...

选项B(

for i in range(len(my_list)):
if i not in checked:
...

选项C(

to_be_checked = set(range(len(my_list))) - checked
for i in to_be_checked:
...

选项A在dict理解中在数据集上循环一次,然后如果没有检查任何内容,则可能再次在整个数据量上循环,因此~O(2n(

选项B在数据上循环,在每个循环上调用"in",它将在所有未检查的循环上循环,因此这大约是~O(n^2(

选项C创建一个在数据上隐式循环的集合,然后做一个也在数据上循环的集合差,然后在该差上调用for循环,所以~O(3n(

我想说A是最快的,但你可以通过使用字典来消除"in"运算符的内部循环,从而使B更快。

事实上,除非你使用足够大的数据集,否则你不会注意到差异

由于if i not in checked,选项A在整个列表上循环一次,在每次迭代时也在整个检查列表上循环,然后在to_be_checked列表~O(3n(上循环

选项B在整个列表上循环,然后检查if i not in checked~O(2n(

选项C在列表上循环一次以创建集合,然后在不考虑冲突的情况下执行通常为O(n(的差异,然后在另一个列表上循环。So~O(3n(

最新更新