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