Eu acho que o uso de cada um é muito subjetivo para eu entrar nisso, então vou me limitar aos números.
Eu comparei o tempo que leva para criar e alterar uma variável em um dicionário, uma classe new_style e uma classe new_style com slots.
Aqui está o código que usei para testá-lo (é um pouco confuso, mas faz o trabalho).
import timeit
class Foo(object):
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
def create_dict():
foo_dict = {}
foo_dict['foo1'] = 'test'
foo_dict['foo2'] = 'test'
foo_dict['foo3'] = 'test'
return foo_dict
class Bar(object):
__slots__ = ['foo1', 'foo2', 'foo3']
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
tmit = timeit.timeit
print 'Creating...\n'
print 'Dict: ' + str(tmit('create_dict()', 'from __main__ import create_dict'))
print 'Class: ' + str(tmit('Foo()', 'from __main__ import Foo'))
print 'Class with slots: ' + str(tmit('Bar()', 'from __main__ import Bar'))
print '\nChanging a variable...\n'
print 'Dict: ' + str((tmit('create_dict()[\'foo3\'] = "Changed"', 'from __main__ import create_dict') - tmit('create_dict()', 'from __main__ import create_dict')))
print 'Class: ' + str((tmit('Foo().foo3 = "Changed"', 'from __main__ import Foo') - tmit('Foo()', 'from __main__ import Foo')))
print 'Class with slots: ' + str((tmit('Bar().foo3 = "Changed"', 'from __main__ import Bar') - tmit('Bar()', 'from __main__ import Bar')))
E aqui está a saída ...
Criando ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Alterando uma variável ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Então, se você está apenas armazenando variáveis, você precisa de velocidade e não vai exigir que você faça muitos cálculos, eu recomendo usar um dicionário (você pode apenas fazer uma função que se pareça com um método). Mas, se você realmente precisa de classes, lembre-se - sempre use __ slots __ .
Nota:
Testei a 'Classe' com as classes new_style e old_style. Acontece que as classes old_style são mais rápidas de criar, mas mais lentas de modificar (não muito, mas significativo se você estiver criando muitas classes em um loop fechado (dica: você está fazendo isso errado)).
Além disso, os tempos para criar e alterar variáveis podem ser diferentes no seu computador, pois o meu é antigo e lento. Certifique-se de testar você mesmo para ver os resultados 'reais'.
Editar:
Posteriormente, testei o namedtuple: não posso modificá-lo, mas para criar os 10.000 exemplos (ou algo parecido) demorou 1,4 segundos, então o dicionário é realmente o mais rápido.
Se eu alterar a função dict para incluir as chaves e valores e retornar o dict em vez da variável que contém o dict quando eu crio, isso me dá 0,65 em vez de 0,8 segundos.
class Foo(dict):
pass
Criar é como uma classe com slots e alterar a variável é o mais lento (0,17 segundos), portanto , não use essas classes . vá para um dict (velocidade) ou para a classe derivada do objeto ('doce de sintaxe')
dict
pode fazer sentido, para. grande vantagem: ao depurar, basta dizerprint(request)
e você verá prontamente todas as informações de estado. com a abordagem mais clássica, você terá que escrever seus__str__
métodos personalizados , o que é uma droga se você tiver que fazer isso o tempo todo.