Maximización de la Eficiencia de Ordenamiento
Ordenación incorporada
Siempre que sea necesario ordenar una lista, salvo en algunos casos especiales poco frecuentes, casi siempre es preferible utilizar una de sus dos herramientas de ordenación altamente optimizadas: la función sorted()
o el método sort()
. Ambas están implementadas en C y utilizan Timsort, un algoritmo híbrido que combina merge sort e insertion sort para lograr eficiencia.
sorted()
es ideal para la ordenación de propósito general cuando se necesita ordenar cualquier iterable sin modificar los datos originales. Por otro lado, sort()
es más adecuado para listas cuando se acepta la modificación en el lugar.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Ambos métodos son eficientes, pero list.sort()
puede ser solo ligeramente más rápido para listas muy grandes ya que evita crear una nueva lista. Sin embargo, utilice sorted()
si necesita mantener intacta la lista original.
Ordenación parcial con heapq
En los casos en que solo se necesitan los elementos más pequeños o más grandes de un conjunto de datos, no es necesario ordenar todos los datos. El módulo heapq
proporciona métodos eficientes como heapq.nsmallest()
y heapq.nlargest()
para extraer estos elementos sin ordenar completamente el iterable, lo que lo hace más rápido y eficiente en memoria.
Comparemos el rendimiento de la función sorted()
y la función heapq.nsmallest()
para obtener los 10
números más pequeños de una lista:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
Como puedes observar, en nuestro ejemplo particular heapq.nsmallest()
es aproximadamente 10 veces más rápido.
Sin embargo, si la cantidad de elementos más grandes o más pequeños (n
) que deseas obtener es cercana al número total de elementos en la lista, heapq
suele ser más lento que la función sorted()
o el método .sort()
.
Por ejemplo, ahora obtendremos los 100000
elementos más pequeños de la lista:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
En este caso, la función sorted()
supera claramente a heapq
en rendimiento.
1. Necesita ordenar una lista completa de números manteniendo la lista original intacta. ¿Qué función/método de ordenamiento debería utilizar?
2. Está revisando un conjunto de datos de 500,000 registros de ventas. Para identificar las 20 transacciones con mayor generación de ingresos, ¿qué enfoque probablemente será más rápido y eficiente en memoria?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 7.69
Maximización de la Eficiencia de Ordenamiento
Desliza para mostrar el menú
Ordenación incorporada
Siempre que sea necesario ordenar una lista, salvo en algunos casos especiales poco frecuentes, casi siempre es preferible utilizar una de sus dos herramientas de ordenación altamente optimizadas: la función sorted()
o el método sort()
. Ambas están implementadas en C y utilizan Timsort, un algoritmo híbrido que combina merge sort e insertion sort para lograr eficiencia.
sorted()
es ideal para la ordenación de propósito general cuando se necesita ordenar cualquier iterable sin modificar los datos originales. Por otro lado, sort()
es más adecuado para listas cuando se acepta la modificación en el lugar.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Ambos métodos son eficientes, pero list.sort()
puede ser solo ligeramente más rápido para listas muy grandes ya que evita crear una nueva lista. Sin embargo, utilice sorted()
si necesita mantener intacta la lista original.
Ordenación parcial con heapq
En los casos en que solo se necesitan los elementos más pequeños o más grandes de un conjunto de datos, no es necesario ordenar todos los datos. El módulo heapq
proporciona métodos eficientes como heapq.nsmallest()
y heapq.nlargest()
para extraer estos elementos sin ordenar completamente el iterable, lo que lo hace más rápido y eficiente en memoria.
Comparemos el rendimiento de la función sorted()
y la función heapq.nsmallest()
para obtener los 10
números más pequeños de una lista:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
Como puedes observar, en nuestro ejemplo particular heapq.nsmallest()
es aproximadamente 10 veces más rápido.
Sin embargo, si la cantidad de elementos más grandes o más pequeños (n
) que deseas obtener es cercana al número total de elementos en la lista, heapq
suele ser más lento que la función sorted()
o el método .sort()
.
Por ejemplo, ahora obtendremos los 100000
elementos más pequeños de la lista:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
En este caso, la función sorted()
supera claramente a heapq
en rendimiento.
1. Necesita ordenar una lista completa de números manteniendo la lista original intacta. ¿Qué función/método de ordenamiento debería utilizar?
2. Está revisando un conjunto de datos de 500,000 registros de ventas. Para identificar las 20 transacciones con mayor generación de ingresos, ¿qué enfoque probablemente será más rápido y eficiente en memoria?
¡Gracias por tus comentarios!