Я оптимизирую некоторый код, основное узкое место которого выполняется, и доступ к очень большому списку структуроподобных объектов. В настоящее время я использую именованные кортежи для удобства чтения. Но некоторые быстрые сравнительные тесты с использованием «timeit» показывают, что это действительно неправильный путь, когда производительность является фактором:
Именованные кортежи с a, b, c:
>>> timeit("z = a.c", "from __main__ import a")
0.38655471766332994
Класс с использованием __slots__
, с a, b, c:
>>> timeit("z = b.c", "from __main__ import b")
0.14527461047146062
Словарь с ключами a, b, c:
>>> timeit("z = c['c']", "from __main__ import c")
0.11588272541098377
Кортеж с тремя значениями, используя постоянный ключ:
>>> timeit("z = d[2]", "from __main__ import d")
0.11106188992948773
Список с тремя значениями с использованием константного ключа:
>>> timeit("z = e[2]", "from __main__ import e")
0.086038238242508669
Кортеж с тремя значениями, используя локальный ключ:
>>> timeit("z = d[key]", "from __main__ import d, key")
0.11187358437882722
Список с тремя значениями с использованием локального ключа:
>>> timeit("z = e[key]", "from __main__ import e, key")
0.088604143037173344
Прежде всего, есть ли что-нибудь в этих маленьких timeit
тестах, которые сделали бы их недействительными? Я запускал каждый из них несколько раз, чтобы убедиться, что никакое случайное системное событие не отбросило их, и результаты были почти идентичны.
Похоже, словари обеспечивают лучший баланс между производительностью и удобочитаемостью, а занятия идут на втором месте. Это прискорбно, так как для моих целей мне также нужен объект, подобный последовательности; отсюда мой выбор именованных кортежей.
Списки значительно быстрее, но постоянные ключи не поддерживаются; Мне нужно создать группу констант индекса, то есть KEY_1 = 1, KEY_2 = 2 и т. Д., Что тоже не идеально.
Я застрял с этим выбором, или есть альтернатива, которую я пропустил?