Pull to refresh

Comments 9

Класс set (множество) — это одна из ключевых структур данных в Python

Класс set был предложен в PEP218 от 31-Jul-2000 и реализован в Python 2.3 (релиз July 29, 2003). И какая же это «ключевая структура», если 10 лет без неё обходились?

Нехорошо, когда статья начинается со вранья.

Хм интересный вопрос для анализа глянуть какие структуры используются в python проектах нужно будет сделать статистику. )

Кора головного мозга возникла 500 млн. лет назад, а до этого 3.5 млрд. лет без неё как-то обходились.
Однако же теперь для как минимум одного заносчивого биологического вида она стала ключевой структурой.

Метафора красивая, но неуместная.

По-вашему, питон 2.2 и питон 2.3 ключевым образом отличаются? Разработчики питона так не думали, сообщество не высказывало такого мнения.

Ответьте себе на вопрос «почему?», это ключевой вопрос )

Этот приём будет работать аналогично методу .union(), но я рекомендую пользоваться именно .union().

А почему? Есть профит кроме читаемости?

Там сравнивается с распаковкой.

union - это встроенный метод, один вызов встроенной функции. Он сразу создаст новый словарь из двух, выполнив всю обработку внутри себя максимально оптимизировано.
А через распаковку - то надо распаковать, создать новые структуры данных, куда запишутся полученные объекты. Затем идет новый вызов, который уже из этих объектов создаст новый словарь. Потом еще надо удалить промежуточные объекты.
Кажется очевидно, какой метод будет быстрее :)

Очевидно, да неверно. Проверил. Видимо, питон в случае распаковки понимает, что от него хотят. Даже интересно стало - одинаковый байт-код там или разный. Чуть позже, может, залезу посмотрю.

Вот эти варианты у меня работают одинаково:

a = {1, 2, 3, 4}
b = {i for i in range(300)}
for i in range(10000000):
    c = {*a, *b}
a = {1, 2, 3, 4}
b = {i for i in range(300)}
for i in range(10000000):
    c = a.union(b)
time ./t1.py
real	0m21,734s
user	0m21,716s
sys	0m0,016s

time ./t_union.py
real	0m21,744s
user	0m21,736s
sys	0m0,008s

Код разный. Дополнительные объекты не создаются.

c = a.union(b)

0 LOAD_FAST                0 (a)
2 LOAD_METHOD              0 (union)
4 LOAD_FAST                1 (b)
6 CALL_METHOD              1
8 STORE_FAST               2 (c)

c = {*a, *b}

0 BUILD_SET                0
2 LOAD_FAST                0 (a)
4 SET_UPDATE               1
6 LOAD_FAST                1 (b)
8 SET_UPDATE               1
10 STORE_FAST               2 (c)

Во втором случае на одну команду длиннее. Но это не дает существенной разницы в быстродействии.

Ну короче поинт автору в том, чтобы аргументировать такие штуки, потому что в современном мире всё не так просто()

Спасибо за ответ.

Sign up to leave a comment.