[Python-es] Mapear un 'get_attr' [P]
Carlos Zuniga
carlos.zun en gmail.com
Sab Jun 4 17:12:31 CEST 2011
2011/6/4 Carlos Zuniga <carlos.zun en gmail.com>:
> 2011/6/4 Edinson Padron <edinson.padron23 en gmail.com>:
>>
>>> te refieres a getattr?
>>>
>>> getattr(x, 'att')
>>>
>>
>> lamentablemente no es a lo que me refiero, recuerdo que es semejante a lo
>> siguiente:
>>
>> map(funcion('attr'), iterable)
>
> ahh, un closure, tendrías que definir una función así:
>
> def getxattr(attr):
> def foo(x):
> return getattr(x,attr)
> return foo
>
> map(getxattr('attr'), iterable)
>
> No sé si ya existe esa función
>
>>
>>> [x.att for x in iterable]
>>>
>>
>> lo considere, pero como map esta implementado en C, es mucho mas rápido que
>> una list comprehension
>
> Estas seguro? un simple test me muestra que la list comprehension es
> mucho más rápida:
>
> >>> import timeit
> >>> timeit.timeit('map(lambda x: x.numerator, a)', 'a=(1,2,3,4)')
> 2.7023310661315918
>
> >>> timeit.timeit('map(getxattr, a)', """
> a=(1,2,3,4)
> def getxattr(x):
> return x.numerator
> """)
> 2.5119788646697998
>
> >>> timeit.timeit("map(getxattr('numerator'),a)", """
> a=(1,2,3,4)
> def getxattr(attr):
> def foo(x):
> return getattr(x, attr)
> return foo
> """)
> 4.4668419361114502
>
Ligera modificación para evitar generar la función foo en cada
iteración, pero la velocidad aún queda lejos...
>>> timeit.timeit('map(bar,a)', """
a=(1,2,3,4)
def getxattr(attr):
def foo(x):
return getattr(x, attr)
return foo
bar=getxattr('numerator')
""")
3.4971849918365479
Más información sobre la lista de distribución Python-es