それぞれの使用法は私にとって主観的すぎるので、それを理解することはできないと思うので、数値のみを使用します。
辞書で変数を作成および変更するのにかかる時間、new_styleクラス、およびスロット付きのnew_styleクラスを比較しました。
テストに使用したコードは次のとおりです(少し面倒ですが、機能します)。
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')))
そしてここに出力があります...
作成...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
変数を変更しています...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
したがって、変数を格納するだけで、速度が必要で、多くの計算を行う必要がない場合は、dictを使用することをお勧めします(メソッドのように見える関数を常に作成できます)。ただし、本当にクラスが必要な場合は、常に__ スロット __を使用してください。
注意:
「クラス」をnew_styleクラスとold_styleクラスの両方でテストしました。old_styleクラスは作成が速いが変更が遅いことがわかります(タイトなループで多くのクラスを作成している場合はそれほど重要ではありませんが重要です(ヒント:間違っている))。
また、私のものは古くて遅いので、変数を作成したり変更したりする時間はあなたのコンピューター上で異なるかもしれません。自分でテストして、「実際の」結果を確認してください。
編集:
私は後でnamedtupleをテストしました。変更することはできませんが、10000サンプル(またはそのようなもの)を作成するのに1.4秒かかったため、辞書が本当に最速でした。
私は場合は辞書機能を変更するキーと値を含めるようにし、代わりに辞書を含む変数の辞書を返すために、私はそれを作成するとき、それは私に与え代わりに0.8秒の0.65を。
class Foo(dict):
pass
作成はスロットを持つクラスのようなもので、変数の変更が最も遅い(0.17秒)ので、これらのクラスは使用しないでください。辞書(速度)またはオブジェクトから派生したクラス(「構文キャンディ」)に行く
dict
せることは意味があります。きちんとした利点:デバッグするときは言うだけで、print(request)
すべての状態情報がすぐに表示されます。より古典的なアプローチでは、カスタム__str__
メソッドを作成する必要があります。これは、常に行う必要がある場合には面倒です。