[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