我正在尝试加速以下代码。程序应该在字符串中找到普遍的数字。这是一个数字,它出现在字符串中超过
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 :(得分:1)
我想我会使用.most_common(1)
collections.Counter
成员函数
for line in lst:
...
d = collections.Counter(nline)
m = d.most_common(1)
print( "None" if m is None else m[0] )
请参阅:https://docs.python.org/3/library/collections.html#collections.Counter.most_common
虽然我认为没有太多的速度可以获得。繁重的工作是nline
中所有元素的频率计数。