[英]How to optimize this series of requests and iterations in python and mongodb
[英]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)
中,因為count
在O(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.