我有这个循环:
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有1.8M条目。当它到达ziplist部分时显然非常慢,我已经设置为在成功找到匹配时打印“MATCH FOUND”,并且它在20分钟内没有打印。我该怎么做才能更快地采取行动?
代码的目的:
循环显示销售数据,其中包含销售的苹果数量和购买地点,提取位置和数量信息。然后,循环通过苹果经销商,找到他们的位置和他们的名字。然后,循环显示邮政编码之间的距离的ziplist数据,按距离的升序排序。第二个它找到了销售拉链和经销商拉链的匹配,它将它们添加到包含所有信息的字典中。
答案 0 :(得分:2)
将ziplist
作为(zip1,zip2,distance)的实际列表是疯狂的 - 您需要一个数据结构,您可以直接找到所需的项目,而无需遍历整个数据集。
以(zip1,zip2)为键的字典,以及作为值的距离,将会非常快。请注意,您还需要在键(zip2,zip1)下插入每个距离,以处理相反方向的查找。或者,您可以将[zip1,zip2]排序为数字顺序,然后再将其用作键(在插入和查找中),这样它们的指定顺序并不重要。
答案 1 :(得分:2)
您可以做的最好的事情是重新组织您的代码,这样您就不必多次循环,而且您不必进行任意多次查找。在我看来,你需要尽可能多地循环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
,请考虑一些能够让您更快查找的内容。
答案 2 :(得分:0)
问题的根源在于您多次处理邮政清单 - 每笔交易,然后再次进行每笔交易。
一种可能性是颠倒你的编码顺序:从拉链列表开始,然后是销售清单,最后是交易字典。如果您要多次迭代某些内容,至少迭代较小的字典会快得多。
如果没有很多匹配,也许在"中使用"会更快,比如if dealzip in zips:
,然后从那时开始处理。