【问题标题】:Fast way to check two lists for consistency检查两个列表是否一致的快速方法
【发布时间】:2013-12-12 04:03:16
【问题描述】:

我需要检查两个列表的一致性,例如,如果第一个列表不包含第二个列表中不存在的元素,并且类似元素的 count 相同,则返回 True。到目前为止,我得出以下结论:

def is_consistent(spec_a, spec_b):
    for a in spec_a:
        if spec_a.count(a) != spec_b.count(a):
            return False
    return True

但我需要循环执行,所以我想知道,它可以更快吗?

【问题讨论】:

    标签: python performance algorithm list


    【解决方案1】:

    如果我正确理解了这个问题,也许您可​​以使用Counter

    from collections import Counter
    def is_consistent(spec_a, spec_b):
        c1 = Counter(spec_a)
        c2 = Counter(spec_b)
        result = c1 - c2
        return all(result[key] == 0 for key in c1)
    

    循环是不可避免的——它总是以某种形式存在。事实上,我这里有 3 个循环。 (每个Counter 一个,最后是最明显的一个)。但是,我的解决方案避免的操作是 .count,这是另一个嵌套在 inside 另一个循环中的隐式循环。

    嵌套循环通常是您要消除的循环,因为如果外部循环迭代 N 次而内部循环迭代 N 次,那么您总共有 N*N 次迭代。将其与我的解决方案进行比较,该解决方案只有 ~3*N 次迭代(3 个循环,每个循环大约 N 次迭代)。如果N 很大,您可以看到这将如何导致大量操作被保存。

    【讨论】:

    • 事实上,这现在有三个循环而不是两个循环——每个Counter 构造函数必须循环其输入,然后在传递给all 的生成器表达式中有一个循环。优点是三个扁平循环串联运行,而不是一个循环内部有一个嵌套循环。因此,如果您有 N 个元素,则需要 3 * N 步,而不是 N * N,如果 N 不小,这是一个巨大的胜利。
    • 显然知道这一点(并且还知道第三个循环实际上小于N,并且两个版本都短路了……);我是为了一个可能不会的新手的利益而解释它。
    • 我认为不需要在答案中;如果有人需要更多信息,评论就在那里,而对于不需要的人来说,答案很简单。
    • @abarnert -- 哎呀,太晚了:-P
    • 回想起来,因为“它可以更快吗?”是OP的主要问题,我想解释为什么答案更快是合理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2020-03-30
    • 2019-01-14
    相关资源
    最近更新 更多