Установить понимание VS.Для Loop VS.Установить разницу - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю над небольшим решателем 3SAT, написанным на Python.Я просматриваю список списков (в следующих примерах он называется my_list).У меня также есть набор checked, который хранит индексы элементов в my_list, которые не должны проверяться при просмотре списка.Какое из следующих действий, по вашему мнению, будет быстрее?

Вариант A)

to_be_checked = {i for i in range(len(my_list)) if i not in checked}
for i in to_be_checked:
    ...

Вариант B)

for i in range(len(my_list)):
    if i not in checked:
        ...

Вариант C)

to_be_checked = set(range(len(my_list))) - checked
for i in to_be_checked:
    ...

1 Ответ

0 голосов
/ 11 декабря 2018

Опция A зацикливается на наборе данных один раз в понимании dict, а затем, возможно, может снова зациклить весь этот объем данных, если ничего не проверено, так что ~ O (2n)

Опция B зацикливается на данных и включаеткаждый цикл вызывает 'in', который будет перебирать все not_checked, так что это будет примерно ~ O (n ^ 2)

Опция C создает набор, который неявно зацикливается на данных, а затем выполняет разность наборов, которая такжеперебирает данные, а затем вызывает цикл for для этой разницы, так что ~ O (3n)

Я бы сказал, что A - самый быстрый, но вы могли бы потенциально сделать B быстрее, избавившись от внутреннего цикла изв 'оператор с помощью словаря.

Реально вы не заметите разницу, если не используете достаточно большие наборы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...