[英]How to speed up a for loop?
我有這個循環:
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
而且它需要永遠運行。 銷售詞典有1.3萬個條目,交易詞典有1000個條目,郵編列表有180萬個條目。 當它到達ziplist部分時,它的速度顯然非常慢,我將其設置為在成功找到匹配項時打印“ MATCH FOUND”,並且超過20分鍾未打印。 我該怎么做才能更快地執行此操作?
代碼的目的:
循環瀏覽包含出售的蘋果數量和購買地點的銷售數據,提取地點和數量信息。 然后,遍歷蘋果經銷商,找到他們的位置和名字。 然后,遍歷顯示郵政編碼之間的距離的ziplist數據,並按距離的升序排序。 第二個找到匹配的銷售郵政編碼和經銷商郵政編碼,並將它們與所有信息一起添加到詞典中。
將ziplist
作為(zip1,zip2,距離)的實際列表是很瘋狂的-您需要一個數據結構,在其中可以直接找到所需的項目,而不必遍歷整個數據集。
以(zip1,zip2)為鍵,而距離為值的字典會更快。 請注意,您還需要在鍵(zip2,zip1)下插入每個距離,以沿相反方向進行查找。 另外,您可以在將[zip1,zip2]用作鍵之前(按插入和查找方式)按數字順序進行排序,因此指定它們的順序無關緊要。
最好的辦法是重新組織代碼,這樣就不必循環那么多次,也不必進行多次查找。 在我看來,您遍歷ziplist
次數是您實際需要的ziplist
次。 這里有一些想法可能會有所幫助:
首先,創建一種通過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
,請考慮一些可以使您更快地查找的內容。
問題的根源在於,您要多次處理zip列表-對於每筆交易,然后對於每筆交易都要再次處理。
一種可能是反轉編碼順序:從zip列表開始,然后是銷售列表,最后是Deals字典。 如果要多次迭代某個對象,至少迭代較小的字典會更快。
如果沒有太多匹配項,則也許使用“ in”會更快,例如, if dealzip in zips:
然后從那時開始進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.