2024-10-03 02:46:13 发布
网友
假设有两个集合,set1非常大(几百万个值),而set2相对较小(几十万个值)。如果我想使用.interstation()函数获得这两个集合之间的值的交集,是否会根据输入的顺序进行运行时改进
例如,其中一个会比另一个跑得快吗
set1.intersection(set2) set2.intersection(set1)
不,输入顺序不重要。在CPython(标准Python实现)中,set_intersection函数处理集合交集。如果另一个参数也是一个集合,则函数将交换这两个集合,以便迭代较小的集合,而较大的集合用于(恒定时间)查找,如Booboo described:
set_intersection
if (PySet_GET_SIZE(other) > PySet_GET_SIZE(so)) { tmp = (PyObject *)so; so = (PySetObject *)other; other = tmp; } while (set_next((PySetObject *)other, &pos, &entry)) { key = entry->key; hash = entry->hash; rv = set_contains_entry(so, key, hash); if (rv < 0) { Py_DECREF(result); return NULL; } if (rv) { if (set_add_entry(result, key, hash)) { Py_DECREF(result); return NULL; } } }
因此,在set1和set2被设置的地方,set1.intersect(set2)和set2.intersect(set1)将具有相同的性能。用timeit进行的一项小型实证测试表明:
set1
set2
set1.intersect(set2)
set2.intersect(set1)
timeit
import random import string import timeit big_set = set() while len(big_set) < 1000000: big_set.add(''.join(random.choices(string.ascii_letters, k=6))) small_set = set() while len(small_set) < 10000: small_set.add(''.join(random.choices(string.ascii_letters, k=6))) print("Timing...") print(f"big_set.intersection(small_set): {min(timeit.Timer(lambda: big_set.intersection(small_set)).repeat(31, 500))}") print(f"small_set.intersection(big_set): {min(timeit.Timer(lambda: small_set.intersection(big_set)).repeat(31, 500))}")
不,输入顺序不重要。在CPython(标准Python实现)中,
set_intersection
函数处理集合交集。如果另一个参数也是一个集合,则函数将交换这两个集合,以便迭代较小的集合,而较大的集合用于(恒定时间)查找,如Booboo described:因此,在
set1
和set2
被设置的地方,set1.intersect(set2)
和set2.intersect(set1)
将具有相同的性能。用timeit
进行的一项小型实证测试表明:相关问题 更多 >
编程相关推荐