在列表中做一个集合与在列表中做一个集合相比有很大的时差

2024-04-23 06:52:48 发布

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

我有下面的测试用例,在这里我找到两个字符串中的元素,并按第一个字符串的顺序返回它们。为什么第二种情况,即set(string2)是在列表中完成的,理解速度慢了一个数量级?你知道吗

import timeit
timeit.timeit(
    """
    import random, string
    string1 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
    string2 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
    v=set(string2)
    [x for x in string1 if x in v]
    """,
    number=10,
)
# 2.005337953567505

timeit.timeit(
    """
    import random, string
    string1 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
    string2 = ''.join(random.choice(string.ascii_uppercase) for _ in range(100000))
    [x for x in string1 if x in set(string2)]
    """,
    number=10,
)
# 22.1062970161438

Tags: 字符串inimportforstringasciirangerandom
1条回答
网友
1楼 · 发布于 2024-04-23 06:52:48

Python正在为列表中“循环”的每个迭代构建set(string2)集。它不知道每次都是同一套。你知道吗

例如,每次python执行列表理解if子句时,都会计算x in set(string2),这意味着每次都会创建集合。由于x是100000个字符串的每个字符,这意味着(相同的)集合在第二种情况下被构建了100000次,但在第一种情况下只构建了一次(您将集合定义为v)。你知道吗

相关问题 更多 >