Últimamente, estoy realizando estudios sobre la eficiencia de distintos códigos python. Mirando qué tipo de colección podía ser más eficiente según qué tareas, me encuentro con el siguiente párrafo en la documentación de ["deque"][1]:
"Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction. Though list objects support similar operations, they are optimized for fast fixed-length operations and incur O(n) memory movement costs for pop(0) and insert(0, v) operations which change both the size and position of the underlying data representation." He comprobado que, efectivamente, el costo de insertar elementos al principio de una lista es mucho mayor que añadir elementos al final de la lista (x10000). En estos momentos , necesito trabajar con listas de números muy largas (> 10e6 elementos) para trocear en dos pedazos, invertir uno de ellos y volverlos a empalmar (método "2-opt"). Una forma de expresarlo: L[i+1:j+1] = L[j:i:-1] con i+1<j que equivale a: L[:i] + L[j:i:-1] + L[j+1:] Esta última expresión, aunque más clara, es poco eficiente al tener que crear una nueva lista partiendo de tres sublistas intermedias. Los elementos no cambian de valor y tampoco cambia el tamaño de la lista. Parece que la "lista" es la estructura más eficiente para esta tarea (por lo que cuenta la documentación) siempre que no se modifique en tamaño. Pero me pregunto si hay algún modo de hacer este manejo más eficiente, tal vez usando alguna otra estructura, en python o numpy, que mejore estas tareas de corte y empalme. Intuyo que con "arrays" se reducen las necesidades de memoria, pero en estos momentos, la memoria es lo que menos me preocupa. Busco un método genérico que pueda valer para cualquier otro tipo de datos (eg: lista de vectores). [1]: http://docs.python.org/2/library/collections.html#collections.deque -- 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@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/