Python幾種分組計數方法比較

在數據清洗的過程中,常常會用到分組計數,當數據量很大的時候,需要考慮運行速度。Python中有多種方式可以實現分組計數,本文匯總了搜集到的幾種方法,並對它們的運行速度做了測試。

首先,生成一個長度為1000萬的隨機字元串列表,並引入時間模塊計算運行時長:

import randomnimport stringnimport timenn = 10000000nran_str = [None]*nnfor i in range(n):n ran_str[i] = random.choice(string.ascii_letters)n

方法一:利用Python基礎的字典

tic = time.process_time()nd = {}nfor i in ran_str:n if i not in d:n d[i] = 1n else:n d[i] += 1ntoc = time.process_time()nprint(str((toc-tic)*1000))n

方法一用分組的元素作為字典的鍵,然後循環疊加計數。運行時間大概為1800ms。

方法二:內置模塊collections的defaultdict

tic = time.process_time()nfrom collections import defaultdictndd = defaultdict(int)nfor i in ran_str:n dd[i] += 1ntoc = time.process_time()nprint(str((toc-tic)*1000))n

Python原始的字典,如果沒有鍵,直接賦值會報錯,所以方法一要進行if判斷。而defaultdict可以直接給不存在的鍵賦值,運行時間大概為1400ms,稍微快一些。

方法三:內置模塊collections的Counter

tic = time.process_time()nfrom collections import Counternword_counts = Counter(ran_str)ntoc = time.process_time()nprint(str((toc-tic)*1000))n

collections的Counter是一個計數器,返回的是字典形式的數據類型,可以用word_counts.items()調用鍵和值。該方法運行時間大概為500ms,速度明顯提升。

方法四:內置模塊itertools的groupby

tic = time.process_time()nfrom itertools import groupbynran_str.sort()ngroups = ((k,len(list(g))) for k,g in groupby(ran_str))ntoc = time.process_time()nprint(str((toc-tic)*1000))n

itertools的groupby需要先對序列進行排序,第一次運行時間大概為2700ms,但是第二次以後運行時間僅有150ms,因為序列已經排序了。如果事先對序列排序,這種方法是最快的,而前三種方法的運行時間都不受排序的影響。groupby返回的是一個迭代器,可以通過for i,j in groups: print(i,j)調用結果。

推薦閱讀:

數據化管理-商品採購
談談流計算
Human Resources Analytics——你會是下一個辭職的嗎?
發現有人時空旅行的證據……
打野不參團,為什麼不去玩單機?

TAG:数据分析 | 数据挖掘 | Python入门 |