如何高效统计大向量中1~10000数值的出现次数?
高效统计数值出现次数的优化方案
你的原方案采用双重遍历的方式,每统计一个数值就完整遍历一次数十万条数据,时间复杂度为O(K*N)(K为要统计的数值范围数,N为数据总量),操作次数可达数十亿次,效率极低。以下是两种大幅提升效率的优化方案:
方案一:使用numpy的bincount(推荐,最快)
numpy的bincount是底层C实现的计数方法,仅需遍历一次数据即可完成所有数值的统计,时间复杂度为O(N),适合处理大型numpy数组:
import numpy as np # 若df2不是numpy数组,先转换为numpy数组 df2_np = np.array(df2) # 直接统计所有数值的出现次数,结果数组的索引对应原数值,值为出现次数 counts = np.bincount(df2_np) # 确保结果覆盖1到10000的所有数值(若原数据中缺少某些数值,对应位置补0) photons = np.zeros(10001, dtype=int) photons[:len(counts)] = counts # 此时photons[x]即为数值x的出现次数,x范围0-10000,完全满足你"索引对应原数值"的需求
方案二:使用collections.Counter(适合普通列表)
如果你的df2是Python普通列表,可使用标准库的Counter,同样仅遍历一次数据完成统计:
from collections import Counter import numpy as np # 统计所有数值的出现次数,返回字典{数值: 次数} count_dict = Counter(df2) # 初始化结果数组,索引对应原数值 photons = np.zeros(10001, dtype=int) for num, cnt in count_dict.items(): if 1 <= num <= 10000: photons[num] = cnt
两种方案均只需遍历一次数据,效率比原方法提升数百甚至数千倍,即使后续数值量级提升,也能在数秒内完成统计。
内容的提问来源于stack exchange,提问作者In the blind
相关产品推荐
相关产品推荐

