有什么方法可以避免计算所有3个集合的交集,然后对前100个数字进行切片?
到目前为止,我的代码是:
def intersection_alg():
get_set_from_variable = [A,B,C]
cfs_set = set()
for logical_name in get_set_from_variable:
tmp_set = set(get_list_from_db(logical_name))
cfs_set = cfs_set.intersection(tmp_set) if cfs_set else cfs_set
return list(cfs_set)[:100]
答案 0 :(得分:1)
您可以使用生成器和itertools.islice
,请参见下面的示例。根据您对集合内容的了解,也许可以通过更改for
循环中的迭代顺序来提高性能。
运行之间的确切结果可能会有所不同,因为集合会以任意顺序进行迭代。
游乐场:answer
import itertools
def lazy_intersection(*sets):
for x in min(sets, key=lambda s: len(s)):
if all(x in s for s in sets):
yield x
a = {2*k for k in range(1000)}
b = {3*k for k in range(1000)}
c = {5*k for k in range(1000)}
generator = lazy_intersection(a, b, c)
first_10 = list(itertools.islice(generator, 10))
print(first_10)
输出(请注意,不能保证升序):
[0, 30, 60, 90, 120, 150, 180, 210, 240, 270]
资源: