簡體   English   中英

如何針對 100000 次迭代優化 python 循環?

[英]How to optimize python loop for 100000 iterations?

我是 python 的新手,我正在嘗試編寫一個 function,其描述如下:我有一個整數列表。 從這個列表中,我必須找到頻率最高的項目並打印出來。 這似乎很簡單,除非我有一個限制,即 function 必須在 10 秒內完成執行並且應該消耗 memory < 512 MB 對於較短的列表長度,我的 function 可以正常工作,但對於長度為 100000 的列表,它會坦克。 我無法優化代碼。 我有兩個相同的實現:

實施#1

def returnMaxFrequency(ar):
    freqList = []
    for val in ar:
        freq = ar.count(val)
        freqList.append(freq)
    return(max(freqList))

實施#2

def returnMaxFrequency(ar):   
    freqDict = {x:ar.count(x) for x in ar}   
    maxFreq = max(freqDict.values())
    return maxFreq

例如

if ar = [3 2 1 3]
o/p: 2

在這里使用 NumPy 不是一個選項。 (不能使用外包裝)

最簡單(並且相當快)可能是內置的Counter

from collections import Counter
winner = Counter(ar).most_common(1)[0]

本文給出了一種更快的方法(並且不使用額外的 memory,但破壞了原始數組),在此處復制:

# Python program to find the maximum repeating number 

# Returns maximum repeating element in arr[0..n-1]. 
# The array elements are in range from 0 to k-1 
def maxRepeating(arr, n,  k): 

    # Iterate though input array, for every element 
    # arr[i], increment arr[arr[i]%k] by k 
    for i in range(0,  n): 
        arr[arr[i]%k] += k 

    # Find index of the maximum repeating element 
    max = arr[0] 
    result = 0
    for i in range(1, n): 

        if arr[i] > max: 
            max = arr[i] 
            result = i 

    # Uncomment this code to get the original array back 
    #for i in range(0, n): 
    #    arr[i] = arr[i]%k 

    # Return index of the maximum element 
    return result 

(此代碼的一部分可以用性能更高的替代方法替換,特別是使用max function 而不是第二個循環。)

您的兩個實現基本相同,第二個只使用列表推導而不是 for 循環。 兩種算法都在O(n^2)中,因為countO(n)中,並且您調用它n次(每個值一次)。

如果要優化,請降低復雜度(到O(n) ):

def returnMaxFrequency(ar):   
    freqDict = {x:0 for x in ar}
    for val in ar:
        freqDict[val] = freqDict[val] + 1
    maxFreq = max(freqDict.values())
    return maxFreq

希望這可以幫助!

我們正在使用 Python 的高性能容器數據類型( Counter

from collections import Counter

def returnMaxFrequency(ar):
    return max(Counter(t).values())

Counter對您的號碼進行頻率映射並創建了一個dict ,一旦創建了dict ,您就可以使用max來獲取列表的 max-freq 。

除非您要使用分布式計算解決方案,否則使用 Dict 是生成頻率計數的有效方法

注意: collections是 python 內置 package 即附帶設置。 不是外部庫。

返回list出現頻率最高的值

max(set(ar), key=ar.count) 

那這個呢?:

max(ar.count(i) for i in ar)

或這個?:

max(map(ar.count,ar))

第二個實現很好,但在 dict-comprehension 中將ar更改為set(ar) ,它只會檢查每個項目一次:

def returnMaxFrequency(ar):   
    freqDict = {x:ar.count(x) for x in set(ar)}   
    maxFreq = max(freqDict.values())
    return maxFreq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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