2016-02-16 78 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