我认为每个人的用法对我来说太主观了,所以我只是坚持数字。
我比较了创build和更改字典中的variables,new_style类和new_style类带槽的时间。
这是我用来testing它的代码(这有点乱,但它做的工作。)
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')))
这里是输出…
创build…
Dict: 0.817466186345 Class: 1.60829183597 Class_with_slots: 1.28776730003
更改variables…
Dict: 0.0735140918748 Class: 0.111714198313 Class_with_slots: 0.10618612142
所以,如果你只是存储variables,你需要速度,并不需要你做很多计算,我推荐使用一个字典(你总是可以做一个看起来像一个方法的函数)。 但是,如果你确实需要类,记住 – 总是使用__ slots __ 。
注意:
我用new_style和old_style类testing了'Class'。 事实certificate,old_style类创build速度较快,但修改速度较慢(如果您在紧密的循环中创build大量类,则不会太多但意义重大(提示:您做错了))。
另外,由于我的老旧速度很慢,因此在计算机上创build和更改variables的时间可能会有所不同。 确保你自己testing看到“真实”的结果。
编辑:
我后来testing了namedtuple:我不能修改它,但创build10000个样本(或类似的东西)花了1.4秒,所以字典确实是最快的。
如果我改变字典function ,包括键和值,并返回字典,而不是包含字典的variables,当我创build它给我0.65而不是0.8秒。
class Foo(dict): pass
创build就像一个有插槽的类,改变variables是最慢的(0.17秒),所以不要使用这些类 。 去一个字典(速度)或从对象派生的类('语法糖果')