【发布时间】:2014-11-26 17:01:44
【问题描述】:
我有两套:
>>> a = {1,2,3}
>>> b = {2,3,4,5,6}
我想获得 两个 具有 非 共同元素的新集合,第一个集合包含来自 a 的元素,第二个包含来自 b 的元素,例如 ({1}, {4,5,6}) ,或类似:
>>> c = a&b # Common elements
>>> d = a^b # Symmetric difference
>>> (a-b, b-a)
({1}, {4, 5, 6})
>>> (a-c, b-c)
({1}, {4, 5, 6})
>>> (a&d, b&d)
({1}, {4, 5, 6})
我的问题是我要在大量 sha1 哈希上使用它,我担心性能。 什么是有效地做到这一点的正确方法?
注意:a 和 b 将有大约 95% 的共同元素,1% 将在 a 和 4% 在 b。
【问题讨论】:
-
a-b, b-a是我过去这样做的方式,但它是为了可读性而不是性能。为什么不尝试一些方法并通过timeit分别运行它们? -
我认为你无法击败
a-b, b-a。 Python 所要做的就是评估名称a和b,然后用-进行二进制减法(你可以用dis.dis看到确切的细分)。然而,创建新集合的实际函数是用 C 编写的,这将优于用 Python 编写的任何东西。 -
我认为
a-b, b-a将是 O(n) 并且无论如何我无法想象有什么比O(n)更好的方法。使用一次迭代而不是两次迭代不会改变复杂性。 -
无论如何这是一个有趣的问题,当我在关系数据库上更新多对多时找出要添加/修改/删除哪些元素时,我经常需要这样做
标签: python performance python-3.x set