视图可以让您访问底层数据结构,而无需复制它。除了动态创建列表之外,它们最有用的用途之一是in
测试。比如,您想要检查一个值是否在字典中(无论是键还是值)。
第一种选择是使用dict.keys()
创建一个包含所有键的列表,这样做可以起到作用,但显然会消耗更多的内存。如果字典非常大呢?那将是浪费。
使用views
可以迭代实际数据结构,而不需要中间列表。
让我们举个例子。我有一个包含1000个随机字符串和数字的键值对字典,k
是我想查找的键。
large_d = { .. 'NBBDC': '0RMLH', 'E01AS': 'UAZIQ', 'G0SSL': '6117Y', 'LYBZ7': 'VC8JQ' .. }
>>> len(large_d)
1000
timeit.timeit('k in large_d.keys()', setup='from __main__ import large_d, k', number=1000000)
13.748743600954867
>>> list_keys = large_d.keys()
>>> timeit.timeit('k in list_keys', setup='from __main__ import large_d, k, list_keys', number=1000000)
8.874809793833492
>>> timeit.timeit('k in large_d.viewkeys()', setup='from __main__ import large_d, k', number=1000000)
0.08828549011070663
如您所见,迭代view
对象可以大幅提升性能,同时减少内存开销。当需要执行类似于Set
的操作时应使用它们。
注意:本文基于 Python 2.7 运行。