扩展Python的namedtuple:如何避免子类化的开销?

2024-09-19 23:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将以下功能添加到Python的collections.namedtuple

Lazy = namedtupleforthelazytm('Lazy', ('A', 'B'))
inst = Lazy(1, 2)
# namedtuple has this:
inst[0]
inst.A
# I want this:
SV = 'A'
inst[SV]

下面的代码似乎可以实现这一点

^{pr2}$

然而,所带来的性能损失是巨大的:

>>> from timeit import timeit
>>> from collections import namedtuple
>>> from nmdtpl import namedtupleforthelazytm
>>> 
>>> def stress(o):
...     for i in range(100000):
...         x = o[0]
...         x = o[1]
...         x = o.a
...         x = o.b
...
>>> orig = namedtuple('O', ('a', 'b'))(1, 2)
>>> subc = namedtupleforthelazytm('S', ('a', 'b'))(1, 2)
>>> 
>>> timeit('f(a)', number=10, globals={'f':stress, 'a':orig})
0.13294775993563235
>>> timeit('f(a)', number=10, globals={'f':stress, 'a':subc})
2.1330132230650634

我的问题是:有没有一种方法可以让所需的功能更便宜一点(不一定从namedtuple开始)?在

澄清:

对我来说,namedtuple的好处在于,与使用元组相比,namedtuple使代码更具可读性,同时避免了完整映射的开销。 我可以使用getattr(inst, SV),但这样做有违目的(可读性)——如果发现单个结构太容易阅读而无法保证任何操作,请考虑嵌套结构。在


Tags: 代码fromimport功能thisnamedtuplecollectionslazy