[Python-es] Mapear un 'get_attr' [P]

Carlos Zuniga carlos.zun en gmail.com
Sab Jun 4 16:57:04 CEST 2011


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

    >>> timeit.timeit('[x.numerator for x in a]', 'a=(1,2,3,4)')
    1.0678210258483887

Esto usando python 2.6

Saludos
-- 
Linux Registered User # 386081
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.


Más información sobre la lista de distribución Python-es