我有这个循环:
for s in sales:
salezip = sales[s][1]
salecount = sales[s][0]
for d in deals:
dealzip = deals[d][1]
dealname = deals[d][0]
for zips in ziplist:
if salezip == zips[0] and dealzip == zips[1]:
distance = zips[2]
print "MATCH FOUND"
if not salesdict.has_key(dealname):
salesdict[dealname] = [dealname,dealzip,salezip,salecount,distance]
else:
salesdict[dealname][3] += salecount
,它需要永远运行。销售词典有13K条目,交易词典有1000个条目,Ziplist有180万个条目。显然,当它撞到Ziplist部分时,它将其设置为成功找到比赛时打印"匹配",并且在20分钟内没有打印。我该怎么做才能使此举更快?
代码的目的:
通过销售数据循环,其中包含售出的苹果数量和购买的位置,提取位置和数量信息。然后,通过苹果经销商循环,找到他们的位置和名字。然后,循环浏览Ziplist数据,该数据显示邮政编码之间的距离,并以距离上升顺序排序。第二个找到了销售邮政编码和经销商zip的匹配,它将它们添加到具有所有信息的字典中。
将ziplist
作为(zip1,zip2,距离)的实际列表疯狂 - 您想要一个数据结构,您可以直接找到所需的项目,而无需循环浏览整个数据设置。
(zip1,zip2)作为键,距离作为值的字典将更快地更快。请注意,您还需要在键(zip2,zip1)下插入每个距离,以朝相反的方向处理查找。另外,您可以将[zip1,zip2]在数字顺序中排序,然后再将其用作密钥(在插入和查找上),以便在。
您可以做的最好的事情是重新组织代码,这样您就不必循环很多次,而且您不必做很多查询。在我看来,您的循环循环是ziplist
的130k倍。以下是一些可能会有所帮助的想法:
首先,创建一种方法来快速查找按ZIP而不是名称来处理信息:
sale_by_zip = {sales[key][1]: sales[key] for key in sales}
deal_by_zip = {deals[key][1]: deals[key] for key in deals}
然后,通过ziplist
进行迭代,唯一的外循环:
for zips in ziplist:
salezip = zips[0]
dealzip = zips[1]
if salezip in sale_by_zip and dealzip in deal_by_zip:
distance = zips[2]
print "MATCH FOUND"
dealname = deal_by_zip[dealzip][0]
salecount = sale_by_zip[salezip][0]
if not salesdict.has_key(dealname):
salesdict[dealname] = [dealname,dealzip,salezip,salecount,distance]
else:
salesdict[dealname][3] += salecount
这应该大大减少您需要做的处理量。
正如其他人所指出的那样,ziplist
的结构也不是最适合此问题的结构。我的建议假设ziplist
是您从外部来源收到的东西,并且不需要额外的通行证就无法更改格式。但是,如果您自己构建ziplist
,请考虑可以更快地查找的东西。
问题的根源是您要多次处理邮政编码列表 - 每次交易,然后再次处理每次销售。
一种可能性是扭转您的编码顺序:从邮政编码列表,然后是销售列表开始,最后是Deals字典。如果您要多次迭代某些内容,那么至少在较小的词典中迭代会更快。
如果没有太多匹配,也许使用" in"会更快,例如if dealzip in zips:
,然后从那时开始处理。