Каков наиболее эффективный способ определения элементов списка, которые превышают пороговое значение? - PullRequest
0 голосов
/ 16 марта 2019

В общем, мне интересно, что является наиболее эффективным методом , чтобы найти элементы списка Python со значением больше, чем, скажем, n.

Я полагаю, самый простой, но не настолько эффективный, как показано ниже,

for i in range(len(theList)):
    if theList[i] > n:
        subList.append(theList[i])

Более того, у нас есть одна строка for, как показано ниже,

(subList for subList in theList if sublist > n)

(Пожалуйста, исправьте меня, если есть что-тонеправильно с приведенным выше синтаксисом)

Наконец, мы можем использовать функцию filter(), что неудобно, по крайней мере для меня.

Указанные выше методы были всеми способами, которые я знаю,Если вы знаете какой-нибудь лучший метод, пожалуйста, скажите мне.В противном случае, пожалуйста, объясните, какой из них лучший, с точки зрения эффективности и время выполнения .

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Нет всегда правильного ответа на этот вопрос, и было несколько сообщений SO о скорости различных подходов при обработке списка, см., Например, здесь , здесь или здесь .

Какой самый быстрый способ может сильно зависеть от вашего списка.При этом давайте просто посмотрим, насколько быстры предложенные подходы.

Для простых сравнений, подобных этому, вы можете использовать timeit :

1.Случай: цикл for

for_case = """newList=[]
for x in theList:
    if x > n:
            newList.append(x)"""

2.Кейс: Список понимания

list_comp = '[x for x in theList if x > n]'

3.Случай: Фильтр (как-то не понравился)

filtering = 'list(filter(lambda x: x > n, theList))'

Некоторая подготовка:

import timeit
si = 'theList=range(2000);n=1000;'  # using list(range(2000)) has no effect on the ranking

Итак, давайте посмотрим:

timeit.timeit(si+list_comp, number=10000)
Out[21]: 1.3985847820003983
timeit.timeit(si+filtering, number=10000)
Out[22]: 3.315784254024038
timeit.timeit(si+for_case, number=10000)
Out[23]: 2.0093530920275953

Так что, по крайней мере, на моей машине, понимание списка убирает его, затем следует for -циклоп, и, по крайней мере, в этом случае нелюбимый filter действительно самый медленный.

0 голосов
/ 16 марта 2019

версия для понимания списка:

sublist = [ i for i in the_list if i > n ]

Выражение генератора: (если список огромного размера)

sublist = ( i for i in the_list if i > n )
...