Я оптимизирую некоторый код, чье основное узкое место работает и обращается к очень большому списку объектов типа struct. В настоящее время я использую namedtuples для удобочитаемости. Но некоторые быстрые бенчмаркинга с использованием "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
, которые сделают их недействительными? Я бегал каждый раз, чтобы убедиться, что случайное системное событие не отбросило их, и результаты были почти идентичными.
Казалось бы, словари предлагают лучший баланс между производительностью и удобочитаемостью, при этом классы идут вторым. Это печально, так как для моих целей мне также нужен объект, похожий на последовательность; следовательно, мой выбор namedtuple.
Списки выполняются значительно быстрее, но постоянные ключи недоступны; Мне нужно создать кучу индексных констант, т.е. KEY_1 = 1, KEY_2 = 2 и т.д., Что также не идеально.
Я придерживаюсь этих вариантов, или есть альтернатива, которую я пропустил?