python - 计算部分列表出现次数的最快方法
问题描述
从开始位置到停止位置计算元素出现次数的最快方法是什么。
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方式来实现这一点?
解决方案
如果您想要一个纯 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))
推荐阅读
- java - 通过 Java 套接字发送图像
- node.js - PDF 在无服务器上运行的 node.js 上显示空白
- javascript - 将处于 redux 状态的对象存储为值
- r - 同一绘图上的多个 Pen 的游行图
- python - pandas - 根据列值复制每一行'n'次
- c++ - 在C++中继承时,受保护的方法可以成为私有方法吗?
- android - 数据的 getContentResolver() 值为 null 但正确接收名称
- python - 构建python代码以通过subprocess.Popen运行消息
- dialogflow-es - 如何处理同音异义词
- c - realloc():两次计算后下一个大小无效