接到一个需求,一个250w的字符串构成的数组s1,一个大概100w个字符串构成的数组s2,需要从A中去掉B中出现过的。
想了想这不是很简单吗,花了不到半分钟写出第一份代码:
# 读文件部分省略
for i in s2:
if i in s1:
s1.remove(i)
结果一跑不得了,半个小时以后一点动静都没有,ctrl+c,趴在地上想了一下,优化起来也很简单:
实际操作只有两步,分别拿出来试一下时间:
def isin(i):
start = time.time()
print(s2[i] in s1)
now = time.time()
print(now - time)
True
0.05784010887145996
def remove_s(i):
start = time.time()
s1.remove(s2[i])
now = time.time()
print(now - time)
0.026719093322753906
确实很慢,首先考虑s1换成dict,hash table查找会快很多:
s1_dict = {x:1 for x in s1}
def isin_dict(i):
start = time.time()
print(s2[i] in s1_dict)
now = time.time()