Оптимизация выражения понимания Python - PullRequest
1 голос
/ 12 октября 2019

Я пытался получить частоту максимального значения в целочисленном списке (intlist)

intlist.count(max(intlist)) 

, это работает и также хорошо по скорости.

Я хотел реализоватьМакс метод с пониманием, -

[x if x>y else y for x in intlist for y in intlist if x!=y][-1]

, позже оказывается очень медленным. Можно ли указать, в чем здесь проблема. тестирование с

intlist=np.array([1, 2, 3,3,-1])

в этом случае ожидаемое значение равно 2, так как 3 является максимальным значением, и это происходит 2 раза.

1 Ответ

1 голос
/ 12 октября 2019

Понимание списка не будет рассчитывать максимальное значение в первую очередь. В самом деле, он будет здесь вычислять максимум двух значений из intlist последних значений. Таким образом, если последние два элемента в списке не совпадают, он вычислит максимум из last двух значений.

Более того, он не очень эффективен, так как работает в O (n 2 ) время и O (n 2 ) память. Таким образом, для огромных списков это потребует гигантских объемов памяти.

Обычно не рекомендуется использовать понимание списка, если список не нужен в первую очередь. Вы можете вычислить максимум с помощью цикла for, где вы каждый раз сравниваете элемент с полученным на данный момент максимумом:

def other_max(listlike):
    mmax = listlike[0]
    for x in listlike:
        if x > mmax:
            mmax = x
    return mmax

или с помощью numpy мы можем суммировать массив логических значений:

>>> (intlist == intlist.max()).sum()
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...