我试图将以下功能添加到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)
,但这样做有违目的(可读性)——如果发现单个结构太容易阅读而无法保证任何操作,请考虑嵌套结构。在
目前没有回答
相关问题 更多 >
编程相关推荐