[Python-es] Eficiencia de las listas

Chema Cortes pych3m4 en gmail.com
Mie Ago 7 18:25:28 CEST 2013


El día 7 de agosto de 2013 17:56, Kiko <kikocorreoso en gmail.com> escribió:

> pandas está muy 'cythonizado' por lo que para muchas operaciones
> debería ser muy buena opción. Su funcionamiento pretende emular parte
> de la funcionalidad de R (dataframes).

Sí, ya me doy cuenta que todo va moviéndose muy rápido. De momento
quiero centrarme en R y OpenBUGS (inferencia bayesiana), pero tengo a
pandas y scikit-learn en espera.

> Si trabajas con información muy 'grande' que no entra en memoria una
> buena opción es pytables ya que el acceso a los datos es muy rápido.
> Si te entra todo en memoria quizá no es necesario que lo pruebes
> ahora.

De momento, no paso de 5 ó 6 GB. que es aún manejable. Procuro que las
operaciones no aumenten el gasto de memoria, pero preveo pasar a otras
estrategias como el cálculo distribuido.

> Gente que andaba desarrollando numexpr (Francesc) ahora están metidos
> en continuum que son los desarrolladores de numba, blaze,... Numexpr
> es un jit de un subconjunto limitado de operaciones. Numba quizá sea
> algo más generalista y es realmente brillante cuando hay que meterse
> en bucles y la vectorización de numpy no ayuda del todo
> (http://jakevdp.github.io/blog/2013/06/15/numba-vs-cython-take-2/).

Sigo bastante de cerca la labor de Francesc, Travis Oliphant y el
resto del equipo de continuum. LLVM (usado por numba) está entre las
"estrategias" de cálculo distribuido consideradas, aunque no descarto
soluciones del estilo hadoop.


>
> Saludos.
>
> El 07/08/13, Chema Cortes <pych3m4 en gmail.com> escribió:
>> El día 7 de agosto de 2013 14:30, Kiko <kikocorreoso en gmail.com> escribió:
>>
>>> mira también rot90, fliplr, flipud...
>>>
>>> http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html#rearranging-elements
>>
>> Los había mirado, pero son funciones para  >= 2-d. No veo cómo usarlas
>> con listas unidimensionales.
>>
>>
>>>
>>> El 07/08/13, Chema Cortes <pych3m4 en gmail.com> escribió:
>>>> El día 6 de agosto de 2013 16:38, Daπid <davidmenhur en gmail.com> escribió:
>>>>> 2013/8/6 Chema Cortes <pych3m4 en gmail.com>:
>>>>
>>>>> Por otro lado, si la operación de inversión no se hace sobre el array,
>>>>> sino sobre una copia, se gana tiempo:
>>>>>
>>>>> In [31]: l2 = l.copy()
>>>>>
>>>>> In [32]: %timeit l[i+1:j+1]=l2[j:i:-1]
>>>>> 10000 loops, best of 3: 101 us per loop
>>>>
>>>> He mirado un poco mejor el funcionamiento de los arrays en numpy. Los
>>>> troceos no crean nuevos arrays, sino lo que llama "vistas" ("views")
>>>> (a excepción de los "fancy indexing" de numpy). Como las vistas están
>>>> enlazadas con el objeto original, los cambios en una vista se efectúan
>>>> directamente sobre el objeto original de forma eficiente.
>>>>
>>>> Creo que usaré los arrays de numpy para operaciones con listas
>>>> grandes. También necesitaba hacer rotar la lista, cosa que veo que
>>>> puede hacer con np.roll, aunque no es tan eficiente como deque
>>>> .rotate() que realiza la operación "in-place".
>>>>
>>>> Como curiosidad, había descartado algunas pruebas bizarras con deque,
>>>> pero muestra lo increiblemente rápido que puede llegar a ser:
>>>>
>>>> d=deque(l)
>>>>
>>>> %timeit d.rotate(-i-1);d.extendleft([d.popleft() for _ in
>>>> range(j-i)]);d.rotate(i+1)
>>>> 10 loops, best of 3: 29.8 ms per loop
>>>>
>>>> Es la misma operación que l[i+1:j+1]=l2[j:i:-1], primero rotando la
>>>> lista hacia la izquierda, añadiendo la lista invertida al principio y
>>>> volviendo a rotar hacia la derecha para mantener el mismo orden.
>>>>
>>>>
>>>> --
>>>> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
>>>> http://ch3m4.org/blog
>>>> Buscador Python Hispano: http://ch3m4.org/python-es
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> http://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>>
>> --
>> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
>> http://ch3m4.org/blog
>> Buscador Python Hispano: http://ch3m4.org/python-es
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> http://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/



-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es


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