簡體   English   中英

如何加快for循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM