首页 > 解决方案 > 计算部分列表出现次数的最快方法

问题描述

从开始位置到停止位置计算元素出现次数的最快方法是什么。

 list = [a,b,c,c,d,c....] can be very long
 count(list,c, from = 2, till = 4) = 2.

我们可以做

 counter = 0
 for i in range(startpos, endpos):
        if symbol == list[i]:
            counter+= 1

或者我们可以做

list[startpos:endpos].count(symbol)

但是,这看起来仍然比第一个选项慢,并且会复制列表的很大一部分

由于字符串具有这样的计数函数,我们可以将列表连接到字符串,而不是使用内置计数函数,但是由于列表很大,转换为字符串似乎不是一种更快的方法。

有没有更快的pythonic方式来实现这一点?

标签: pythonpython-3.xlistperformance

解决方案


如果您想要一个纯 Python 解决方案,将您的第一个选项转换为sum函数中的生成器表达式可能是对于非常大的列表最有效的解决方案:

sum(1 for i in range(startpos, endpos) if list[i] == symbol)

其他选项,例如从列表的开头迭代,这会浪费大量时间迭代超出所需范围,或者切片,这涉及创建副本,当列表非常大时,效率几乎不会那么高。

但是,如果您不介意使用numpy,则可以创建一个numpy数组而不是列表,这样您就可以在不复制项目的情况下对其进行切片(切片时numpy创建数组的视图),然后使用该sum方法计算数量切片中的项目等于所需值:

import numpy as np

... # create your very large numpy array as lst

print(np.sum(lst[startpos:endpos] == symbol))

推荐阅读