您现在的位置是:主页 > news > 彩票网站开发违法/河南郑州最新消息今天
彩票网站开发违法/河南郑州最新消息今天
admin2025/5/23 20:02:45【news】
简介彩票网站开发违法,河南郑州最新消息今天,网站建设中布局,徐州商城网站建设在数据清洗的过程中,常常会用到分组计数,当数据量很大的时候,需要考虑运行速度。Python中有多种方式可以实现分组计数,本文汇总了搜集到的几种方法,并对它们的运行速度做了测试。首先,生成一个长度为1000万…
在数据清洗的过程中,常常会用到分组计数,当数据量很大的时候,需要考虑运行速度。Python中有多种方式可以实现分组计数,本文汇总了搜集到的几种方法,并对它们的运行速度做了测试。
首先,生成一个长度为1000万的随机字符串列表,并引入时间模块计算运行时长:
import random
import string
import time
n = 10000000
ran_str = [None]*n
for i in range(n):
ran_str[i] = random.choice(string.ascii_letters)
方法一:利用Python基础的字典
tic = time.process_time()
d = {}
for i in ran_str:
if i not in d:
d[i] = 1
else:
d[i] += 1
toc = time.process_time()
print(str((toc-tic)*1000))
方法一用分组的元素作为字典的键,然后循环叠加计数。运行时间大概为1800ms。
方法二:内置模块collections的defaultdict
tic = time.process_time()
from collections import defaultdict
dd = defaultdict(int)
for i in ran_str:
dd[i] += 1
toc = time.process_time()
print(str((toc-tic)*1000))
Python原始的字典,如果没有键,直接赋值会报错,所以方法一要进行if判断。而defaultdict可以直接给不存在的键赋值,运行时间大概为1400ms,稍微快一些。
方法三:内置模块collections的Counter
tic = time.process_time()
from collections import Counter
word_counts = Counter(ran_str)
toc = time.process_time()
print(str((toc-tic)*1000))
collections的Counter是一个计数器,返回的是字典形式的数据类型,可以用word_counts.items()调用键和值。该方法运行时间大概为500ms,速度明显提升。
方法四:内置模块itertools的groupby
tic = time.process_time()
from itertools import groupby
ran_str.sort()
groups = ((k,len(list(g))) for k,g in groupby(ran_str))
toc = time.process_time()
print(str((toc-tic)*1000))
itertools的groupby需要先对序列进行排序,第一次运行时间大概为2700ms,但是第二次以后运行时间仅有150ms,因为序列已经排序了。如果事先对序列排序,这种方法是最快的,而前三种方法的运行时间都不受排序的影响。groupby返回的是一个迭代器,可以通过for i,j in groups: print(i,j)调用结果。