如何在 for 循环中加速?如何提高代码的性能?

问题描述

我想提高代码性能。我之前按照建议尝试了几种方法,但是我的代码速度仍然很慢。除了尝试我尝试过的方式,我还能做什么?

我的代码在这里

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 的元素)。

由于 listpython 中的实现方式,.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']

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...