I noticed that iterating over a dictionary seems quite slower than creating an iterator and iterating over it. Maybe I miss something?
marco@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@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) )) -- https://mail.python.org/mailman/listinfo/python-list