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

Я думаю, что я хотел бы использовать функцию .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.

+0

Спасибо за большинство, не разобрались. Однако это вряд ли дает какое-либо преимущество в производительности. Как вы сказали. – Sharky

Смежные вопросы