【发布时间】:2018-11-11 04:31:43
【问题描述】:
在下面的代码中,lowFrequencyWords 是一个包含低频词的列表,而 doc 是一个标记列表。
doc=[w for w in doc if not w in lowFrequencyWords]
问题是这段代码永远存在。
我确定,但我认为问题在于从列表中删除中间元素的操作成本为 O(n),其中 n 是列表的大小。由于 lowFrequencyWords 的数量很大,python 必须重复很多次。我查找了链表,但我相信它们在 Python 中不可用。
【问题讨论】:
-
将
lowFrequencyWords设为frozenset(lowFrequencyWords)以...开始 -
也使用
doc[:] = [w for w in doc if w not in frozenset_of_lowFreq]可能会有所帮助-不确定-有人告诉我那是某种就地替换可能会更快。别问我,只是听说... -
因为您主要使用 O(n) 查找来查看列表,但从未找到您的单词(它们的频率很低)。所以你基本上一直迭代所有的lowFreqWords。集合有不断的查找 - 比较快。 freezesets 只是集合的不可变表亲。
-
@PatrickArtner
doc[:] =与速度无关...只是可变性...a = [1, 2, 3]; b = a...然后a = [4, 5, 6]...您只需重新绑定名称@987654328 @ 到一个新列表,b仍然指的是原始列表......如果你这样做a[:] = [4, 5, 6]那么你正在改变a和b引用的基础列表,所以b也将是参考更新的列表。 -
@JonClements 感谢您的解释 - 这是我 15 个月前开始使用 pyhton 时得到的某种“晦涩”提示,但似乎从未正确理解。好的,从列表组合的“优化速度”类别中被禁止:)
标签: python-3.x nlp nltk