скорость методов построения множественного списка (понимания или нет?) - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь найти наиболее эффективный способ построения двух отдельных списков с условием if для вычисления логического значения, возвращаемого функцией.

Содержащий список trunc_keys содержит не более 15 строковых элементов.Тест был выполнен с 10 элементами.

Общая функция:

def is_trunc(key):
      # about 10 lines of string manipulation that ultimately returns boolean

Метод 1:

trunc_key_list = [key for key in trunc_keys if is_trunc(key)]
bad_key_list = [key for key in trunc_keys if not is_trunc(key)]

Метод 2:

trunc_key_list = []
bad_key_list = []

[trunc_key_list.append(key) if is_trunc(key) else bad_key_list.append(key) for key in trunc_keys]

Я рассчитал результаты, используя start_time = time.time() и print("%s" % (time.time() - start_time))

Результаты (в среднем за 20 прогонов)

Метод 1 : 0,000411 Метод 2 : 0,000280

Я ожидал, что метод 1 будет быстрее.Я думал, что списочные понимания были идеальными для такого типа ситуации, избегая необходимости создавать пустые списки.Я нашел этот поток, который, кажется, поддерживает этот результат: Список Python () против скорости построения понимания списка

Я довольно плохо знаком с Python и хотел бы понять это лучше.Разве списки не становятся выгодными при таком маленьком размере списка?Я что-то упускаю?

Я ценю любые идеи, спасибо!

1 Ответ

1 голос
/ 12 июня 2019

Если вы заметили, что мы можем подсчитать количество раз выполнения каждого оператора:

Пусть L будет длиной списка

  • Метод 1 раз выполнялся
    • is_trunc(key) - побежал L * 2
    • append(key) - побежал L * 0
  • Метод 2 раза побежал
    • is_trunc(key) - побежалL * 1
    • append(key) - пробег L * 1

с этого поста мы можем видеть, что среднее время для добавленияis:

~115 μs or 0.000115 seconds

  • Общее время метода 1 (один цикл) без добавления: 0.000411 / 2 = 0.0002055
  • Общее время метода 2 без добавления: 0.000280 - 0.000115 = 0.000165

Затем мы можем вычесть общее время метода 1 и общее время метода 2, чтобы получить:

  • разница во времени цикла: 0.0002055 - 0.000165 = 0.0000405
  • общее время цикларазница: 0.0000405 * 2 = 0.000081

0,000081 в основном незначительна.Таким образом, циклы работают почти с одинаковой скоростью, но в первом методе вы повторяете список дважды, так что это занимает вдвое больше времени.

Take Away: is_trunc(key) дорого!Что ты там делаешь ??:)

...