При работе с данными в Python вы можете столкнуться с ситуациями, когда вам нужно использовать наборы или замороженные наборы. Наборы и замороженные наборы — это два типа данных, которые обычно используются в Python для хранения коллекций уникальных элементов. Хотя оба они во многом похожи, между ними есть некоторые важные различия. В этом сообщении блога мы рассмотрим различия между наборами и замороженными наборами, а также то, когда вы должны использовать один вместо другого.

Набор и замороженный набор — это два встроенных типа данных коллекции в Python, которые используются для хранения коллекции уникальных элементов. В то время как набор является изменчивым, что означает, что мы можем добавлять, удалять или изменять элементы в наборе, замороженный набор является неизменным и не может быть изменен после создания.

Различия между набором и замороженным набором

  1. Изменчивость. Как упоминалось ранее, набор может быть изменен, а FrozenSet — неизменяем. Это означает, что мы можем добавлять или удалять элементы из набора, но не из замороженного набора.
  2. Использование памяти. Поскольку набор является изменяемым, для хранения элементов требуется больше памяти по сравнению с Frozenset, который неизменяем и требует меньше памяти.
  3. Хешируемость. Набор может содержать только объекты, которые можно хешировать, т. е. объекты, хеш-значение которых остается постоянным на протяжении всего их жизненного цикла. С другой стороны, замороженный набор может содержать любой неизменяемый объект, включая другие замороженные наборы.
  4. Итерация: и набор, и замороженный набор поддерживают итерацию, но, поскольку замороженный набор неизменяем, его можно повторять более эффективно, чем набор.

Случаи использования набора и замороженного набора

  1. Удаление дубликатов. Одним из наиболее распространенных вариантов использования set является удаление дубликатов из списка или любой другой последовательности. Поскольку наборы содержат только уникальные элементы, мы можем преобразовать последовательность в набор, что автоматически удалит дубликаты.
my_list = [1, 2, 3, 2, 1, 4, 5, 4]
my_set = set(my_list)
print(my_set)  # Output: {1, 2, 3, 4, 5}

2. Тестирование на членство. И набор, и замороженный набор эффективны для тестирования на членство. Мы можем использовать оператор in, чтобы проверить, присутствует ли элемент в наборе или в замороженном наборе.

my_set = {1, 2, 3, 4, 5}
if 3 in my_set:
    print("Element found")
else:
    print("Element not found")

3. Сохранение хэшируемых элементов. Поскольку наборы содержат только хэшируемые элементы, они полезны, когда нам нужно хранить коллекцию уникальных хэшируемых элементов.

my_set = {'apple', 'banana', 'cherry'}

4. Хеширование ключей в словаре: поскольку FrozenSet неизменяем, его можно использовать в качестве ключа в словаре, тогда как set нельзя использовать в качестве ключа, поскольку он является изменяемым.

my_dict = {frozenset({1, 2}): 'value'}
print(my_dict)  # Output: {frozenset({1, 2}): 'value'}

5. Использование памяти. Что касается использования памяти, frozenset занимает меньше памяти, чем обычный set. Это связано с тем, что set является изменяемым, что означает, что его элементы могут быть добавлены, удалены или изменены после его создания. В результате set необходимо выделить дополнительную память, чтобы учесть эти изменения. С другой стороны, frozenset является неизменяемым, поэтому ему не требуется дополнительное выделение памяти, что делает его более эффективным с точки зрения использования памяти.

Чтобы продемонстрировать это, вы можете использовать функцию sys.getsizeof() в Python для проверки использования памяти объектами.

import sys

s = {1, 2, 3, 4, 5}
fs = frozenset(s)

print(sys.getsizeof(s))  # output: 736
print(sys.getsizeof(fs)) # output: 224

Подводя итог, можно сказать, что set и frozenset являются важными типами данных в Python, которые предлагают уникальные возможности для обработки коллекций уникальных элементов. set является изменяемым и может быть изменено, а frozenset является неизменным и не может быть изменено после создания. set предлагает более быстрые операции для модификаций, а frozenset предлагает более эффективное использование памяти для коллекций только для чтения.

При выборе между set и frozenset решение должно основываться на конкретном варианте использования и требованиях приложения. Если вам нужна коллекция, которую можно модифицировать или обновлять с течением времени, то set — лучший выбор. С другой стороны, если у вас есть коллекция только для чтения, которая не будет изменяться, то frozenset обеспечивает лучшую эффективность использования памяти и может использоваться в качестве хешируемого ключа для словарей и других структур данных.