正如您所观察到的,在功能方面,视图更好。兼容性方面,它们更糟。
一些性能指标,取自 64 位 Ubuntu 机器上的 Python 2.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
构造视图的成本略高,但使用视图比迭代器快得多(快两倍多一点)。
处理千元字典:
>>> 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())
为了与and进行公平比较list(dict.iterkeys())
,dict.keys()
明显更快:
>>> timeit(lambda: emptydict.keys())
0.2385849952697754
>>> timeit(lambda: fulldict.keys())
7.842105150222778
总结:这是一个权衡;更好的功能(你将很少使用)和性能(很少会重要到足以让你担心——如果你关心这样的性能问题,你可能已经处于需要使用 numpy/scipy 的区域了) 与更好的兼容性和肌肉记忆使用率相比。
就个人而言,除非已经依赖于仅 2.7 的功能,或者除非我完全控制运行时环境,否则我会避免在 Python 2 代码中使用字典视图。即使在这些情况下,我的手指仍然想输入iter
而不是view
,所以我让他们!