如何优化处理超大规模数据集的Python用户通话量统计代码?
大规模数据集user_id通话总量统计效率优化方案
现有代码的核心问题
你的代码存在几个严重拉低效率的问题:
- 把DataFrame转成字典
df_dict = smallerData1.to_dict('records')完全没必要,徒增内存开销和遍历成本 - 用列表
looked_through_ids判断id是否已处理,列表的in操作是O(n)复杂度,数据量大时速度极慢 - 对每个id重新执行
(smallerData1.user_id == caller_id).sum(),相当于对整个数据集重复遍历,时间复杂度直接飙升到O(n²)
优化方案(分单数据集和多数据集场景)
单数据集处理(比如单个500万行的smallerData)
直接用pandas内置的聚合函数,这是最高效的方式:
# 单个数据集统计user_id的通话次数 call_counts = smallerData1['user_id'].value_counts() # 转成字典(如果需要的话) all_ids_dict = call_counts.to_dict()
或者用groupby实现相同效果:
call_counts = smallerData1.groupby('user_id').size() all_ids_dict = call_counts.to_dict()
多数据集批量处理
因为你拆分了多个小数据集,只需逐个统计后合并结果:
from collections import defaultdict all_ids_dict = defaultdict(int) # 假设所有小数据集存在列表smaller_datasets中,比如[smallerData1, smallerData2, ...] for df in smaller_datasets: # 统计当前数据集的user_id通话次数 temp_counts = df['user_id'].value_counts() # 合并到全局统计字典 for user_id, count in temp_counts.items(): all_ids_dict[user_id] += count
额外优化建议
- 不要在Jupyter Notebook里一次性加载所有数据集,处理完一个就释放内存(比如
del df后执行gc.collect()) - 如果原始数据集是csv等格式,建议用
pandas.read_csv的chunksize参数分块读取,无需提前手动拆分数据集 - 若数据量达到5000万行的超大级别,可以考虑用Dask替代pandas,它能自动处理分块并行计算,进一步提升效率
内容的提问来源于stack exchange,提问作者epiphany
相关产品推荐
相关产品推荐

