问题描述
我想提高代码的性能。我之前按照建议尝试了几种方法,但是我的代码速度仍然很慢。除了尝试我尝试过的方式,我还能做什么?
matched_word = []
for w in word_list:
for str_ in dictionary:
if str_ == w:
matched_word.append(str_)
这里有一些参考点:
- 首先,word_list 的长度是 160,000,dictionary 的长度大约是 200,000。
- 其次,我不能使用一组 word_list,因为我想制作一个包含重复词(
matched_word
的元素)的列表 (word_list
)。 - 第三,以下代码仍然运行缓慢。
import collections
matched_word = collections.deque
for w in dictionary:
if w in word_list:
matched_word.append(w)
- 第四,以下代码仍然运行缓慢。
matched_word = [w for w in word_list if w in dictionary]
感谢您的帮助。 (也感谢所有之前提供建议的人。)
解决方法
你不需要遍历字典;只需检查 w
是否是键。您正在将应该是 O(1) 的查找变成 O(n) 的扫描。
matched_word = [w for w in word_list if w in dictionary]
,
我不能使用 word_list 集,因为我想制作一个包含重复词的列表(=matched_word)(=word_list 的元素)。
由于 list
在 python
中的实现方式,.appending
可能需要相对较长的时间,因此 set
由于上述要求不是选项,但在 python 中有结构专门为允许快速插入而开发的标准库,即 collections
内置模块中的 collections.deque
。示例用法
import collections
matched_word = collections.deque()
for w in ["A","B","C","A","B"]:
matched_word.append(w)
matched_word_list = list(matched_word)
print(matched_word_list)
输出
['A','B','C','A','B']