Je suis de l'optimisation de code dont le principal goulot d'étranglement est en cours d'exécution à travers et de l'accès à une liste très importante des struct-comme des objets. Actuellement, je suis en utilisant namedtuples, pour des raisons de lisibilité. Mais certains rapide analyse comparative de l'utilisation de 'timeit" montre que ce n'est vraiment pas la bonne manière d'aller là où la performance est un facteur:
Nommé tuple avec a, b, c:
>>> timeit("z = a.c", "from __main__ import a")
0.38655471766332994
Classe à l'aide d' __slots__
, avec a, b, c:
>>> timeit("z = b.c", "from __main__ import b")
0.14527461047146062
Dictionnaire avec les touches a, b, c:
>>> timeit("z = c['c']", "from __main__ import c")
0.11588272541098377
Tuple avec trois valeurs, à l'aide d'une clé constante:
>>> timeit("z = d[2]", "from __main__ import d")
0.11106188992948773
Liste avec trois valeurs, à l'aide d'une clé constante:
>>> timeit("z = e[2]", "from __main__ import e")
0.086038238242508669
Tuple avec trois valeurs, à l'aide d'une clé locale:
>>> timeit("z = d[key]", "from __main__ import d, key")
0.11187358437882722
Liste avec trois valeurs, à l'aide d'une clé locale:
>>> timeit("z = e[key]", "from __main__ import e, key")
0.088604143037173344
Tout d'abord, est-il quelque chose à propos de ces petits timeit
tests qui permettraient de rendre non valide? J'ai couru chacun plusieurs fois, afin de s'assurer qu'aucun système aléatoire de l'événement avait jeté au loin, et les résultats sont presque identiques.
Il semblerait que les dictionnaires offrent le meilleur équilibre entre les performances et la lisibilité, avec des classes de venir en seconde. C'est malheureux, car, pour ma part, j'ai aussi besoin de l'objet de la séquence-comme; d'où mon choix de namedtuple.
Les listes sont sensiblement plus rapide, mais constante, les touches sont difficile à maintenir; je dois créer un groupe de l'indice de constantes, c'est à dire KEY_1 = 1, KEY_2 = 2, etc. qui n'est pas idéal.
Suis-je coincé avec ces choix, ou est-il une autre solution que j'ai manqué?