Python utiliza Timsort. Timsort necesita saber el número total de elementos por adelantado para calcular el parámetro minrun. Por lo tanto, como informa Sven, lo primero que se ordena al recibir un generador es convertirlo en una lista.
Dicho esto, sería posible escribir una versión incremental de Timsort, que consumía los valores del generador más lentamente - solo tendría que arreglar minrun antes de comenzar, y aceptar el dolor de tener algunas fusiones desequilibradas en el fin. Timsort funciona en dos fases. La primera fase implica un pase a través de toda la matriz, identificando ejecuciones y haciendo una ordenación de inserción para hacer ejecuciones donde los datos están desordenados. Tanto la búsqueda de ejecución como la ordenación de inserción son intrínsecamente incrementales. La segunda fase implica una fusión de las corridas ordenadas; eso sucedería exactamente como ahora.
No creo que haya muchos puntos en esto, sin embargo. Tal vez haría más fácil la administración de la memoria, porque en lugar de tener que leer desde el generador a una matriz en constante crecimiento (como supongo sin fundamento que la implementación actual sí lo hace), podrías leer cada ejecución en un pequeño buffer, luego solo asignar un final tampón de tamaño una vez, al final. Sin embargo, esto implicaría tener ranuras 2N de matriz en la memoria a la vez, mientras que una matriz en crecimiento se puede hacer con 1.5N si se duplica cuando crece. Entonces, probablemente no sea una buena idea.
Impresionante. Gracias. ¿Crees que habría alguna ventaja para realizar algún trabajo durante el primer paso del generador? Sé que esto sería relativamente inconsecuente en general, pero parece que podría ser un poco más eficiente. –
Supongo que usan Quicksort. No parece posible hacer "algún trabajo" durante el primer pase; implicaría intercambiar elementos con el elemento al final de la lista, que aún no se conoce. –
Por lo que he leído sobre la clasificación de Python, hacen muchas optimizaciones y no vuelven a Quicksort. Al transferir los valores de la expresión del generador, en teoría podría hacer algunas comparaciones con los valores que ya ha colocado en su lista. –