【问题标题】:Set comprehension VS. For Loop VS. Set Difference集合理解 VS。对于循环 VS。设置差异
【发布时间】:2019-05-12 05:32:47
【问题描述】:

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

【问题讨论】:

  • 你试过计时吗?
  • @khelwood 我做了,但结果很不稳定。我想知道从设计的角度来看,其中哪一个真的更快。
  • 向我们展示您的计时码和结果,这样我们就不必重复同样的研究了。

标签: python performance time set


【解决方案1】:

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

选项 B 循环遍历数据并在每个循环调用 'in' 时循环遍历所有 not_checked,所以这大约是 ~O(n^2)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2017-10-29
    相关资源
    最近更新 更多