迭代some_dict.items()
的效率如迭代CPython中相同项目的列表一样高效吗?Python:遍历列表vs迭代项目效率
6
A
回答
19
这取决于您使用的是哪个版本的Python。在Python 2中,some_dict.items()
会创建一个新列表,这会占用一些额外的时间并占用额外的内存。另一方面,一旦列表被创建,它就是一个列表,并且在列表创建的开销完成之后应该具有相同的性能特征。
在Python 3中,some_dict.items()
创建了一个视图对象而不是一个列表,并且我预计创建和迭代items()
会比Python 2更快,因为不需要复制任何内容。但我也预测迭代已经创建的视图会比迭代已经创建的列表慢一点,因为字典数据存储有点稀疏,我相信没有好的方法让python避免遍历每一个在词典中的bin - 甚至是空的。
在Python 2,一些计时证实了我的直觉:
>>> some_dict = dict(zip(xrange(1000), reversed(xrange(1000))))
>>> some_list = zip(xrange(1000), xrange(1000))
>>> %timeit for t in some_list: t
10000 loops, best of 3: 25.6 us per loop
>>> %timeit for t in some_dict.items(): t
10000 loops, best of 3: 57.3 us per loop
遍历items
大约慢一倍。使用iteritems
是一个稍微有点快......
>>> %timeit for t in some_dict.iteritems(): t
10000 loops, best of 3: 41.3 us per loop
但是遍历清单本身基本上是一样的迭代比任何其他列表:
>>> some_dict_list = some_dict.items()
>>> %timeit for t in some_dict_list: t
10000 loops, best of 3: 26.1 us per loop
Python 3中可以创建和迭代速度items
(与上面的57.3 us相比):
>>> some_dict = dict(zip(range(1000), reversed(range(1000))))
>>> %timeit for t in some_dict.items(): t
10000 loops, best of 3: 33.4 us per loop
但是创建视图的时间可以忽略不计;迭代实际上比列表慢。
>>> some_list = list(zip(range(1000), reversed(range(1000))))
>>> some_dict_view = some_dict.items()
>>> %timeit for t in some_list: t
10000 loops, best of 3: 18.6 us per loop
>>> %timeit for t in some_dict_view: t
10000 loops, best of 3: 33.3 us per loop
这意味着,在Python 3,如果你想遍历项目多次在一本字典和性能是至关重要的,你可以通过缓存视图列表获得30%的速度提升。
>>> some_list = list(some_dict_view)
>>> %timeit for t in some_list: t
100000 loops, best of 3: 18.6 us per loop
6
一个基准测试显示迭代列表的速度肯定会更快。
def iterlist(list_):
i = 0
for _ in list_:
i += 1
return i
def iterdict(dict_):
i = 0
for _ in dict_.iteritems():
i += 1
return i
def noiterdict(dict_):
i = 0
for _ in dict_.items():
i += 1
return i
list_ = range(1000000)
dict_ = dict(zip(range(1000000), range(1000000)))
测试与IPython的关于Python 2.7(Kubuntu的):
%timeit iterlist(list_)
10 loops, best of 3: 28.5 ms per loop
%timeit iterdict(dict_)
10 loops, best of 3: 39.7 ms per loop
%timeit noiterdict(dict_)
10 loops, best of 3: 86.1 ms per loop
0
虽然通过some_list
迭代为2x加速比some_dict.items()
,而是由索引通过some_list
迭代几乎是与由密钥通过some_dict
迭代。
K = 1000000
some_dict = dict(zip(xrange(K), reversed(xrange(K))))
some_list = zip(xrange(K), xrange(K))
%timeit for t in some_list: t
10 loops, best of 3: 55.7 ms per loop
%timeit for i in xrange(len(some_list)):some_list[i]
10 loops, best of 3: 94 ms per loop
%timeit for key in some_dict: some_dict[key]
10 loops, best of 3: 115 ms per loop
%timeit for i,t in enumerate(some_list): t
10 loops, best of 3: 103 ms per loop
相关问题
- 1. Python Django模板:迭代遍历列表
- 2. Python迭代效率
- 3. 迭代VS ORDER_BY()效率
- 4. 迭代遍历两个列表
- 5. 使用迭代器遍历列表?
- 6. 迭代Inorder遍历
- 7. DFS遍历迭代
- 8. 的Python:高效遍历多维列表
- 9. 遍历列表python
- 10. Python遍历列表
- 11. 遍历列表(Python)
- 12. Python在一些迭代后停止循环遍历列表
- 13. JavaScript数组遍历 - 效率
- 14. 迭代遍历所有行Smartsheet API Python
- 15. c中的迭代目录遍历
- 16. Python:遍历列表项x次?
- 17. 遍历(项目,等等)的列表
- 18. 迭代器中迭代遍历控件
- 19. 遍历列表的列表,并使用第i个迭代器
- 20. 迭代反向序列遍历
- 21. 如何通过array_agg遍历迭代列?
- 22. 迭代遍历类Angular4
- 23. libxmlrpc迭代遍历struct
- 24. 迭代后序遍历bst?
- 25. 迭代八叉树遍历
- 26. itertools.groupby:迭代遍历组pairwise
- 27. C++迭代器遍历
- 28. 迭代DFS如何遍历?
- 29. 遍历列表的Python
- 30. Python循环遍历列表
可能不是,但你可以使用'timeit'来做一些基准测试。 –