设置理解力VS。对于循环VS。设置差异

时间:2018-12-11 08:57:28

标签: python performance time set

我正在研究一个用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:
    ...

1 个答案:

答案 0 :(得分:0)

选项A在dict理解中循环了一次数据集,然后如果没有进行任何检查,则可能再次循环了整个数据量,所以〜O(2n)

选项B遍历数据,并且在每个循环上调用“ in”,这将遍历所有not_checked,因此大约为O(n ^ 2)

选项C创建一个集合,该集合隐式地遍历数据,然后执行一个集差异,也遍历数据,然后对该差异调用for循环,因此〜O(3n)

我想说A是最快的,但是您可以通过使用字典摆脱'in'运算符的内部循环,从而使B更快。

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