我有下面的测试用例,在这里我找到两个字符串中的元素,并按第一个字符串的顺序返回它们。为什么第二种情况,即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
Python正在为列表中“循环”的每个迭代构建
set(string2)
集。它不知道每次都是同一套。你知道吗例如,每次python执行列表理解
if
子句时,都会计算x in set(string2)
,这意味着每次都会创建集合。由于x是100000个字符串的每个字符,这意味着(相同的)集合在第二种情况下被构建了100000次,但在第一种情况下只构建了一次(您将集合定义为v
)。你知道吗相关问题 更多 >
编程相关推荐