如果您想加入`n`个集合,最佳性能似乎来自于`set().union(*list_of_sets)`,它将返回一个新的集合。
因此,使用方法可能如下:
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {4, 5, 6}
s1.union(s2, s3)
s1.update(s2, s3)
在 Alexander Klimenko 上面的回答中,我做了一些简单的测试,如下所示。我相信主要结论是似乎集合越随机,性能差异就越大。
from random import randint
n = 100
generate_equal = lambda: set(range(10_000))
generate_random = lambda: {randint(0, 100_000) for _ in range(10_000)}
for l in [
[generate_equal() for _ in range(n)],
[generate_random() for _ in range(n)]
]:
%timeit set().union(*l)
%timeit reduce(or_, l)
Out:
# equal sets: 69.5 / 23.6 =~ 3
23.6 ms ± 658 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
69.5 ms ± 2.57 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# random sets: 438 / 78.7 =~ 5.6
78.7 ms ± 1.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
438 ms ± 20.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,如果您想进行原地更新操作,最佳性能来自于
set.update
方法,因为在性能方面,
s1.update(s2, s3) = set().union(s2, s3)
。
|
? - Scott Bartelldef apply_set_operation(a, b, set_operation)
。在调用这个函数时,我更喜欢使用apply_set_operation(a, b, set.union)
而不是apply_set_operation(a, b, set.__or__)
。 - bsaa | b
而要调用函数来实现呢? - rodrigo-silveira