2017-01-04 3 views
0

Что более показательно, а что такое асимптотическая сложность (или они эквивалентны) в Python?Python list.append, если нет в списке против производительности set.add

set.add(12) 

if 12 not in somelist: 
    somelist.append(12) 
+3

https://wiki.python.org/moin/TimeComplexity. 'item in list' -' O (n) ', поэтому выигрывает' set.add'. – jonrsharpe

+0

Это было проще, чем я ожидал ответить, позаботьтесь о некоторых деталях реализации в ответ, и я соглашусь с этим? Он говорит, что набор аналогичен dict, являются ли они обе хэш-картами в Cpython? – GL2014

+0

: http://stackoverflow.com/questions/3949310/how-is-set-implemented lists: http://stackoverflow.com/questions/3917574/how-is-pythons-list-implemented –

ответ

4

Комплект намного быстрее, в общем. Тестирование членства в списке - O (n), линейное по размеру списка. Добавление в набор - O (1), независимо от количества элементов в списке. Кроме того, код списка выполняет два вызова функций: один, чтобы проверить, есть ли 12 в списке, а другой - добавить его, в то время как операция set делает только один вызов.

Обратите внимание, что список решение может быть быстрым, хотя, когда элемент не должен быть добавлен в список, потому что он был найден рано в списке.

# Add item to set 
$ python -m timeit -s 's = set(range(100))' 's.add(101)' 
10000000 loops, best of 3: 0.0619 usec per loop 

# Add item not found in list 
$ python -m timeit -s 'l = list(range(100))' 'if 101 not in l: l.append(101)' 
1000000 loops, best of 3: 1.23 usec per loop 

# "Add" item found early in list 
$ python -m timeit -s 'l = list(range(100))' 'if 0 not in l: l.append(0)' 
10000000 loops, best of 3: 0.0214 usec per loop 

# "Add" item found at the end of the list 
$ python -m timeit -s 'l = list(range(102))' 'if 101 not in l: l.append(101)' 
1000000 loops, best of 3: 1.24 usec per loop