如何加快循环加速



我有这个循环:

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:,然后从那时开始处理。

最新更新