我正在优化一些代码,它们的主要瓶颈是运行和访问一个非常大的类 struct 对象列表。目前,为了便于阅读,我使用的是名称元组。但是,一些使用‘ 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
Tuple 具有三个值,使用本地键:
>>> 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,等等,这也不理想。
是我被这些选择困住了,还是我错过了其他的选择?