2016-02-16 77 views
-2

我試圖加快下面的代碼。程序應該在字符串中找到流行的數字。這是數量,這出現在超過加速代碼

LEN(串)的字符串/ 2

倍。挑戰在於輸入文件由隨機數字串組成,每個字符串可以包含數千個數字。我試過了蠻力法

for line in lst: 
    nline = line.split(',') 
    m = [i for i in nline if nline.count(i) > len(nline)/2] 
    print(m[0] if len(m) > 0 else "None") 

並且它產生了大約10秒的運行時間。

最快的版本約0.8秒

for line in lst: 
    nline = line.split(',') 
    d = collections.Counter(nline) 
    n = dict() 
    m = [i for i, n in d.items() if n > len(nline)/2] 
    print(m[0] if len(m) > 0 else "None") 

有什麼方法來進一步提高性能運行?

回答

0

我想我會用collections.Counter

for line in lst: 
    ... 
    d = collections.Counter(nline) 
    m = d.most_common(1) 
    print("None" if m is None else m[0]) 

見的.most_common(1)成員函數:https://docs.python.org/3/library/collections.html#collections.Counter.most_common

雖然我不認爲有將是可以取得巨大的速度。繁重的工作是對nline中所有元素的頻率計數。

+0

感謝most_common,還沒弄明白。但是,這幾乎不會帶來任何性能優勢。就像你所說的。 – Sharky