Python3.intersection()函数的输入顺序在运行时是否重要?

2024-10-03 02:46:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有两个集合,set1非常大(几百万个值),而set2相对较小(几十万个值)。如果我想使用.interstation()函数获得这两个集合之间的值的交集,是否会根据输入的顺序进行运行时改进

例如,其中一个会比另一个跑得快吗

set1.intersection(set2)
set2.intersection(set1)

Tags: 函数顺序set1set2intersectioninterstation
1条回答
网友
1楼 · 发布于 2024-10-03 02:46:13

不,输入顺序不重要。在CPython(标准Python实现)中,set_intersection函数处理集合交集。如果另一个参数也是一个集合,则函数将交换这两个集合,以便迭代较小的集合,而较大的集合用于(恒定时间)查找,如Booboo described

        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;
                }
            }
        }

因此,在set1set2被设置的地方,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))}")

相关问题 更多 >