Есть большая разница в скорости в этих двух фрагментах кода?

1 .

x = set( i for i in data )

Против:

2 .

x = set( [ i for i in data ] )

Я видел людей, которые рекомендуют set() вместо set([]); это просто вопрос стиля?

1
wwwilliam 28 Янв 2013 в 23:49

2 ответа

Лучший ответ

Форма

x = set(i for i in data)

Сокращение для:

x = set((i for i in data))

Это создает генераторное выражение, которое оценивается лениво. По сравнению с:

x = set([i for i in data])

Который создает весь список перед , передавая его set


С точки зрения производительности, выражения генератора допускают короткое замыкание в определенных функциях (на ум приходят all и any) и занимают меньше памяти, поскольку вам не нужно хранить дополнительный список - в некоторых случаи это может быть очень значительным.

Если вы на самом деле собираетесь выполнять итерацию по всему итерируемому data, и память для вас не проблема, я обнаружил, что обычно понимание списка немного быстрее, чем эквивалентное выражение генератора *.

temp $ python -m timeit 'set(i for i in "xyzzfoobarbaz")'
100000 loops, best of 3: 3.55 usec per loop
temp $ python -m timeit 'set([i for i in "xyzzfoobarbaz"])'
100000 loops, best of 3: 3.42 usec per loop

Обратите внимание, что если вам интересно узнать скорость - ваша самая быстрая ставка, вероятно, будет просто:

x = set(data)

Доказательство :

temp $ python -m timeit 'set("xyzzfoobarbaz")'
1000000 loops, best of 3: 1.83 usec per loop

* Только Cpython - я не знаю, как Jython или pypy оптимизируют этот материал.

6
mgilson 28 Янв 2013 в 20:02

Синтаксис [] создает список, который отбрасывается сразу после создания набора. Таким образом, вы увеличиваете объем памяти программы.

Синтаксис генератора избегает этого.

3
StoryTeller - Unslander Monica 28 Янв 2013 в 19:51