Creo que el uso de cada uno es demasiado subjetivo para que pueda entrar en eso, así que me limitaré a los números.
Comparé el tiempo que lleva crear y cambiar una variable en un dict, una clase new_style y una clase new_style con ranuras.
Aquí está el código que utilicé para probarlo (está un poco desordenado pero funciona).
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')))
Y aquí está la salida ...
Creando ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Cambiar una variable ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Entonces, si solo está almacenando variables, necesita velocidad y no requerirá que haga muchos cálculos, le recomiendo usar un dictado (siempre puede hacer una función que parezca un método). Pero, si realmente necesita clases, recuerde: use siempre __ slots __ .
Nota:
Probé la 'Clase' con las clases new_style y old_style. Resulta que las clases old_style son más rápidas de crear pero más lentas de modificar (no mucho, pero sí significativas si estás creando muchas clases en un circuito cerrado (consejo: lo estás haciendo mal)).
Además, los tiempos para crear y cambiar variables pueden diferir en su computadora ya que la mía es vieja y lenta. Asegúrese de probarlo usted mismo para ver los resultados "reales".
Editar:
Más tarde probé la tupla con nombre: no puedo modificarla, pero para crear las 10000 muestras (o algo así) tomó 1,4 segundos, por lo que el diccionario es de hecho el más rápido.
Si cambio la función dict para incluir las claves y los valores y devolver el dict en lugar de la variable que contiene el dict cuando lo creo, me da 0,65 en lugar de 0,8 segundos.
class Foo(dict):
pass
Crear es como una clase con ranuras y cambiar la variable es lo más lento (0.17 segundos), así que no use estas clases . ir por un dict (velocidad) o por la clase derivada del objeto ('syntax candy')
dict
puede tener sentido, a. gran ventaja: cuando depure, solo digaprint(request)
y verá fácilmente toda la información del estado. con el enfoque más clásico, tendrá que escribir sus__str__
métodos personalizados , lo que apesta si tiene que hacerlo todo el tiempo.