"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Aproveitando __slots__ para melhor desempenho em classes Python

Aproveitando __slots__ para melhor desempenho em classes Python

Publicado em 2024-11-12
Navegar:955

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.

Leveraging __slots__ for Better Performance in Python Classes

Como funcionam os 'slots'?

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?

Leveraging __slots__ for Better Performance in Python Classes

Limitações

slots podem ser uma ferramenta útil, mas vêm com limitações:

  • Sem atributos dinâmicos: ao definir slots no corpo da classe, desabilitamos seu atributo padrão (dict), portanto, não podemos adicionar dinamicamente novos atributos à instância após sua criação.
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.

Leveraging __slots__ for Better Performance in Python Classes

Quando usar

Escrevi alguns exemplos de melhores cenários onde podemos usar slots:

  • Quando temos muitas instâncias para criar e o uso de memória é uma preocupação.
  • Quando precisamos otimizar o desempenho.
  • Quando você tem atributos conhecidos e fixos.
  • Quando você trabalha com grandes conjuntos de dados.

Leveraging __slots__ for Better Performance in Python Classes

Considerações finais

É 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.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/conradylx/leveraging-slots-for-better-performance-in-python-classes-2ol4?1 Se houver alguma violação, entre em contato com [email protected] para excluir isto
Tutorial mais recente Mais>

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