gpt4 book ai didi

python - 在 Python 中通过非常大的列表进行计数时提高速度/性能

转载 作者:行者123 更新时间:2023-11-28 21:54:36 25 4
gpt4 key购买 nike

我正在用 Python 3 编写一个程序,它的部分功能是找出列表中出现次数最多的单词并返回该单词出现的次数。我有有效的代码,但部分要求是它需要 200,000 多个单词的列表并在几秒钟内完成此事件,而我的代码需要很长时间才能运行。我想知道您对此方法的速度改进有何建议。

def max_word_frequency(words):    """A method that takes a list and finds the word with the most    occurrences and returns the number of occurences of that word    as an integer.    """    max_count = 0    for word in set(words):        count = words.count(word)        if count > max_count:            max_count = count    return max_count

我考虑过使用字典,因为与列表相比,它们可散列且速度超快,但我还不太清楚如何实现它。

谢谢大家的宝贵时间!
- 芬恩

最佳答案

首先,您的算法在包含 200 000 个单词的整个列表中循环 m 次,其中 m 是此列表中不同单词的数量。这真的不是一个好主意,因为它只是计算单词的迭代次数并选择最大值。我可以向您展示一种更有效的算法(它只能在列表上迭代一次),但是 Python 已经拥有可以执行您想要的操作的工具。

要用几行代码解决您的问题,您可以使用标准库中提供的 Python 算法,该算法已用 C 实现,可能比您的循环更有效。 Counter 类及其 most_common method可能对您有帮助:

>>> from collections import Counter
>>> counts = Counter(['abc', 'def', 'abc', 'foo', 'bar', 'foo', 'foo'])
>>> counts
Counter({'foo': 3, 'abc': 2, 'bar': 1, 'def': 1})
>>> Counter(['abc', 'def', 'abc', 'foo', 'bar', 'foo', 'foo']).most_common(1)
[('foo', 3)]

你只需要返回元组的第二个元素(这里只有一个元组,正如我们在 most_common 中的 1 参数所要求的)

性能比较

只是为了比较,我拿了一个 LaTeX 文件样本 (~12Ko),用空格分割单词(给 x 1835 个单词)并运行你的函数和下面的 timeit 函数。您可以看到真正的收获。

>>> len(x)
1835
>>> def max_word_2(words):
... counts = Counter(words)
... return counts.most_common(1)[0][1]
>>> timeit.timeit("max_word_2(x)", setup="from __main__ import x, max_word_2", number=1000)
1.1040630340576172
>>> timeit.timeit("max_word_frequency(x)", setup="from __main__ import x, max_word_frequency", number=1000)
35.623037815093994

仅此更改可能足以加快您的流程:)

关于python - 在 Python 中通过非常大的列表进行计数时提高速度/性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com