python处理百万级数据时间表_【详解】Python处理大量数据与DICT遍历的优化问题...

本文探讨了在处理大量数据时遇到的问题,如Excel行数限制和DICT遍历效率低下。通过将Excel表转换为CSV格式解决行数限制,并优化DICT遍历方法,显著提升了处理速度。具体优化包括使用`ford,x in dict.items()`遍历DICT,以及利用`dict.has_key()`检查键是否存在,实现了400倍的性能提升。" 111862617,10293470,Java设计模式实践:学区摇号系统改造,"['Java', '设计模式', '软件设计', '消息通知', '事件驱动']
摘要由CSDN通过智能技术生成

前言:本例我们的需求是写一个每天0点运行的脚本。这个脚本从一个实时更新的数据库中提取数据。

每天跑一个Excel表出来,表里是当天零点与昨天零点时的差异的数据展示。

其实是很简单的需求,遇到的关键问题是数据量。该例的数据量太大,每次都能从数据库中拿出20多万条数据。

数据量大的话遇到的问题有这么几个:

1. 数据无法装入Excel表,因为使用Python处理Excel数据,最多插入65536行数据,多了就会报错;

2. 遍历筛选问题。我们拿到两天的数据进行对比,然后生成一个差异对比表。就需要遍历对比两张表的数据,数据量太大,遍历所用时间过长。

对这两个关键的问题,我们现作阐述。

【问题一:Excel表改为Csv表】

我们发现,Csv格式的表,是没有行数限制的,我们可以把20多万条数据直接插入csv表中。

【问题二:DICT类型数据的遍历】

按我们以往的经验,生成对比信息的字典代码如下:

defgetCurrentCompareMessageDict0(dict0,dict1):

'''未被优化的获取当前对比信息字典'''dlist0=list(dict0.keys())

dlist1=list(dict1.keys())

dict2={}

fori inrange(len(dlist1)):

ifdlist1[i] not indlist0:

key=dlist1[i]

value=[0,dict1[dlist1[i]]]

dict2[key]=value

else:

ifdict1[dlist1[i]]/100.0!= dict0[dlist1[i]]:

key=dlist1[i]

value=[dict0[dlist1[i]],dict1[dlist1[i]]]

dict2[key]=value

returndict2 即,先构建两个dict的key列表。

然后,以key列表的长度为上限,进行for循环,采用DICT[KEY]的方式来进行列表数据的筛选。

这个方法的运行是超级慢的。

经过研究我们将该方法改进如下:

defgetCurrentCompareMessageDict(dict0,dict1):

'''优化的获取当前对比信息字典'''dict2={}

i=0ford,x indict1.items():

ifdict0.has_key(str(d)):

ifx/100.0!= string.atof(dict0[str(d)]):

key=d

value=[string.atof(dict0[str(d)]),x]

dict2[key] = value

else:

key=d

value=[0,x]

dict2[key]=value

returndict2 采用该方法后,两组20多万条数据的比对筛选,在1秒内就完成了。

经测试,优化方法后速度提高了大约400倍!

这个方法优化了哪里呢&#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值