Что быстрее при просмотре списков строк?"В" или "индекс"? - PullRequest
2 голосов
/ 27 мая 2010

У меня есть несколько списков строк, и мне нужно знать, есть ли строка в каком-либо из них, поэтому мне нужно искать строку в первом списке, если не найден, во втором, если не найден, в третий ... и т. д.

Мой вопрос: что быстрее?

if (string in stringList1):
    return True
else:
    if (string in stringList2):
        return True
    # ... #

и т. Д. Или использование функции index () внутри блока try / кроме ?

try:
    return stringList1.index(string) >= 0
except:
    try:
        return stringList2.index(string) >= 0
    except:
       # ... #

Я знаю, что "in" является линейным и что обычно рекомендации python "лучше извиниться, чем спрашивать разрешения" (имеется в виду, что второй подход будет лучше), но я хотел бы узнать мнение кого-то более квалифицированного: )

Спасибо!

1 Ответ

12 голосов
/ 27 мая 2010
  1. in - это правильный способ определить, находится ли что-то в контейнере или нет. Не беспокойтесь о быстрой микрооптимизации, пока вы не проверили свое приложение и обнаружили, что оно медленное. профилировал и обнаружил, что его вызывает. На этом этапе оптимизируйте тестирование (модуль timeit может быть полезен для этого), а не взяв слова интернет-чудаков.

    Если вы выполняете много проверок содержимого, вы, вероятно, захотите использовать set вместо последовательности; наборы имеют O (1) поиск. Если это не подходит для вашей проблемы, вы можете использовать список и модуль bisect , который все еще предлагает преимущества алгоритмической производительности по сравнению с операциями последовательности O (n).

  2. Есть шанс, что вы на самом деле имеете в виду if any(string in s for s in iterable_of_string_lists) или if string in string_list_1 or string in string_list_2. Вложение ifs не совсем хороший способ выполнить операцию, подобную той, которую вы показываете.

  3. Никогда не используйте голые except:. Всегда ловите определенное исключение, в этом случае except ValueError. Использование except: будет перехватывать и игнорировать все виды исключений, которые вы не намереваетесь, например, KeyboardInterrupt, если пользователь пытается выйти из вашего приложения, или NameError, если у вас есть опечатка.

...