Penso che l'uso di ciascuno di essi sia troppo soggettivo per me per entrare in questo, quindi mi limiterò ai numeri.
Ho confrontato il tempo necessario per creare e modificare una variabile in un dict, una classe new_style e una classe new_style con slot.
Ecco il codice che ho usato per testarlo (è un po 'disordinato ma fa il lavoro.)
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')))
Ed ecco l'output ...
Creazione ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Modifica di una variabile ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Quindi, se stai solo memorizzando variabili, hai bisogno di velocità e non ti richiederà di fare molti calcoli, ti consiglio di usare un dict (potresti sempre creare una funzione che assomigli a un metodo). Ma, se hai davvero bisogno di lezioni, ricorda: usa sempre __ slot __ .
Nota:
Ho testato la "Classe" con entrambe le classi new_style e old_style. Si scopre che le classi old_style sono più veloci da creare ma più lente da modificare (non di molto ma significativo se stai creando molte classi in un ciclo stretto (suggerimento: stai sbagliando)).
Anche i tempi per la creazione e la modifica delle variabili possono differire sul tuo computer poiché il mio è vecchio e lento. Assicurati di testarlo tu stesso per vedere i risultati "reali".
Modificare:
Successivamente ho testato namedtuple: non posso modificarlo ma per creare i 10000 campioni (o qualcosa del genere) ci sono voluti 1,4 secondi, quindi il dizionario è davvero il più veloce.
Se cambio la funzione dict per includere chiavi e valori e per restituire il dict invece della variabile contenente il dict quando lo creo mi dà 0,65 invece di 0,8 secondi.
class Foo(dict):
pass
La creazione è come una classe con slot e la modifica della variabile è la più lenta (0,17 secondi), quindi non utilizzare queste classi . vai per un dict (velocità) o per la classe derivata da object ('syntax candy')
dict
può avere senso derivare una classe da , a. netto vantaggio: quando esegui il debug, dìprint(request)
e vedrai subito tutte le informazioni sullo stato. con l'approccio più classico dovrai scrivere i tuoi__str__
metodi personalizzati , il che fa schifo se devi farlo tutto il tempo.