Я оптимізую деякий код, головне вузьке місце якого проходить і отримую доступ до дуже великого списку структурних об'єктів. В даний час я використовую 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
тестах щось, що зробило б їх недійсними? Я запускав кожну кілька разів, щоб переконатися, що жодна випадкова системна подія не відкинула їх, і результати були майже однаковими.
Здається, словники пропонують найкращий баланс між продуктивністю та читабельністю, а заняття посідають друге місце. Це прикро, оскільки для моїх цілей мені також потрібен об’єкт, схожий на послідовність; звідси мій вибір іменованого.
Списки значно швидші, але постійні ключі неможливо підтримати; Мені довелося б створити купу констант індексу, тобто KEY_1 = 1, KEY_2 = 2 тощо, що також не є ідеальним.
Я застряг у цьому виборі, чи є альтернатива, яку я пропустив?