Iterating over dict is slower than iterating over iter(dict)?
Marco Sulla
Marco.Sulla.Python at gmail.com
Sat Jul 18 17:18:24 EDT 2020
I noticed that iterating over a dictionary seems quite slower than creating
an iterator and iterating over it. Maybe I miss something?
marco at buzz:~/sources/cpython$ ./python dict_bench.py
Name: `for x in dict`; Size: 8; Time: 1.091e-07
Name: `for x in dict`; Size: 1000; Time: 1.008e-05
Name: `for x in iter(dict)`; Size: 8; Time: 1.845e-08
Name: `for x in iter(dict)`; Size: 1000; Time: 1.844e-08
Name: `iter(dict)`; Size: 8; Time: 5.260e-08
Name: `iter(dict)`; Size: 1000; Time: 5.262e-08
Environment:
marco at buzz:~/sources/cpython$ ./python -VV
Python 3.10.0a0 (heads/master:64053c31a4, Jul 18 2020, 20:14:48)
[GCC 10.1.1 20200718]
dict_bench.py:
import timeit
from string import Template
def autorange(stmt, setup="pass", repeat=5):
if setup == None:
setup = "pass"
t = timeit.Timer(stmt=stmt, setup=setup)
a = t.autorange()
number = a[0]
return min(*t.repeat(number=number, repeat=repeat), a[1]) / number
dict_sizes = (8, 1000)
benchmarks = (
{"name": "for x in dict", "stmt": "for x in it: pass", "setup": """
o = {k:k for k in range($size)}
it = o
"""},
{"name": "for x in iter(dict)", "stmt": "for x in it: pass", "setup":
"""
o = {k:k for k in range($size)}
it = iter(o)
"""},
{"name": "iter(dict)", "stmt": "iter(o)", "setup": """
o = {k:k for k in range($size)}
"""},
)
for benchmark in benchmarks:
for dict_size in dict_sizes:
setup_tpl = benchmark.get("setup")
if setup_tpl == None:
setup = setup_tpl
else:
setup = Template(setup_tpl).substitute(size=dict_size)
print("Name: {: <25} Size: {: >4}; Time: {:.3e}".format(
"`{}`;".format(benchmark["name"]),
dict_size,
autorange(stmt=benchmark["stmt"], setup=setup)
))
More information about the Python-list
mailing list