機能面では、ご覧のとおり、ビューの方が優れています。互換性に関しては、それらはさらに悪いです。
64ビットUbuntuマシン上のPython2.7.2から取得したいくつかのパフォーマンスメトリック:
>>> from timeit import timeit
空の辞書の処理:
>>> emptydict = {}
>>> timeit(lambda: emptydict.viewkeys())
0.24384498596191406
>>> timeit(lambda: list(emptydict.viewkeys()))
0.4636681079864502
>>> timeit(lambda: emptydict.iterkeys())
0.23939013481140137
>>> timeit(lambda: list(emptydict.iterkeys()))
1.0098130702972412
ビューの構築は少しコストがかかりますが、ビューの消費はイテレータよりも大幅に高速です(2倍を少し超える速度)。
千要素辞書の取り扱い:
>>> fulldict = {i: i for i in xrange(1000)}
>>> timeit(lambda: fulldict.viewkeys())
0.24295306205749512
>>> timeit(lambda: list(fulldict.viewkeys()))
13.447425842285156
>>> timeit(lambda: fulldict.iterkeys())
0.23759889602661133
>>> timeit(lambda: list(fulldict.iterkeys()))
15.45390510559082
あまり目立たないが、同じ結果。ビューの作成はごくわずかに費用がかかりますが、それを消費する方が間違いなく高速です(15%高速)。
list(dict.viewkeys())
およびとの公正な比較のためにlist(dict.iterkeys())
、dict.keys()
は明らかに高速です。
>>> timeit(lambda: emptydict.keys())
0.2385849952697754
>>> timeit(lambda: fulldict.keys())
7.842105150222778
要約:これはトレードオフです。より優れた機能(めったに使用しない)とパフォーマンス(これは、心配するほど重要になることはめったにありません。このようなパフォーマンスの問題を気にしている場合は、おそらくすでにnumpy/scipyを操作する必要がある領域にいます。 )対より良い互換性と筋肉のメモリ使用量。
個人的には、2.7のみの機能にすでに依存していない限り、またはランタイム環境を完全に制御しているのでない限り、Python2コードの辞書ビューは避けます。このような場合でも、指iter
ではなく入力したいview
ので、'em!