Cada vez que criamos uma nova classe, o python armazena cada atributo em um atributo dict que é chamado de dicionário dinâmico. Esse comportamento padrão parece ser conveniente, porque é flexível, mas quando você está trabalhando com um grande número de instâncias ou o uso de memória é importante, essa sobrecarga pode ser significativa.
Python basicamente usa um dicionário para armazenar atributos de classe, mas uma das alternativas é usar slots. Ao definir esse nome, estamos dizendo ao Python para usar uma estrutura mais estática e compacta que reduz significativamente o uso de memória. Aqui está um exemplo básico de como usar slots em uma classe.
import sys class WithoutSlots: def __init__(self, x, y): self.x = x self.y = y class WithSlots: __slots__ = ['x', 'y'] def __init__(self, x, y): self.x = x self.y = y obj1 = WithoutSlots(1, 2) obj2 = WithSlots(1, 2) print(sys.getsizeof(obj1.__dict__)) # 296 print(sys.getsizeof(obj2)) # 48
Como mostrado acima, 'WithoutSlots' usa muito mais memória em comparação com 'WithSlots'. Pense em criar muitas instâncias da classe - Qual abordagem seria a melhor escolha?
slots podem ser uma ferramenta útil, mas vêm com limitações:
obj = WithSlots(1, 2) obj.z = 3 # This will raise an AttributeError
Podemos contornar isso adicionando dict ao slot.
Sem herança múltipla: cada classe base deve conter slots definidos, caso contrário o python voltará a usar o dicionário para armazenar os atributos da instância.
Sem valor padrão: você precisa inicializar explicitamente os valores padrão no método init.
Escrevi alguns exemplos de melhores cenários onde podemos usar slots:
É assim que slots são usados em Python: você pode usá-los quando tiver certeza de que não precisará de nenhum outro atributo para sua classe e com os quais está trabalhando um grande número de instâncias. Ao definir slots, você diz ao Python para usar uma estrutura mais eficiente e compacta para armazenar atributos, o que ajuda a economizar memória. Isso é especialmente útil quando o uso de memória é uma preocupação ou quando você precisa otimizar o desempenho. Apenas lembre-se de que com slots, você não pode adicionar novos atributos dinamicamente, por isso é melhor usá-lo quando os atributos de sua classe são fixos e bem definidos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3