Acerca del método sort () integrado de Python

104

¿Qué algoritmo sort()utiliza el método integrado en Python? ¿Es posible echar un vistazo al código de ese método?

Johannes
fuente
10
Por supuesto, es posible consultar el código del método: Python es un proyecto de código abierto. Sin embargo, el método probablemente esté implementado en C, por lo que tendrá que saber un poco sobre C para que tenga algún sentido.
Chris Lutz
¿Importa la versión?
meder omuraliev
@melder: No =) Solo quiero echar un vistazo a un algoritmo profesional: P @chris: ¿cómo?
Johannes
3
Descargue el código fuente al intérprete de Python. No sé dónde implementan el sort()método, o cuál es el formato para el intérprete, pero tiene que estar allí en alguna parte, y apuesto a que está implementado en C por cuestiones de velocidad.
Chris Lutz
Aquí hay un ejemplo de cómo se usa
Hari Ganesan

Respuestas:

119

¡Por supuesto! El código está aquí , comenzando con la función islty continuando durante bastante tiempo ;-). Como sugiere el comentario de Chris, es código C. También querrá leer este archivo de texto para obtener una explicación textual, resultados, etc., etc.

Si prefiere leer código Java que código C, puede mirar la implementación de Joshua Bloch de timsort en y para Java (Joshua también es el tipo que implementó, en 1997, el mergesort modificado que todavía se usa en Java, y uno puede esperar que Java lo haga eventualmente cambiar a su reciente puerto de timsort).

Alguna explicación del puerto Java de timsort está aquí , el diff está aquí (con punteros a todos los archivos necesarios), el archivo clave está aquí - FWIW, aunque soy un mejor programador en C que el programador de Java, en este caso encuentro El código Java de Joshua es más legible en general que el código C de Tim ;-).

Alex Martelli
fuente
4
@Chris, "Explorar fuentes de Python" es un atajo en todas las barras de marcadores de mi navegador; apunta a svn.python.org/view/python/trunk ;-).
Alex Martelli
Quiero saber qué hace la función list_ass_item(). :)
Chris Lutz
2
Realiza la asignación a un elemento de la lista (al igual que list_ass_slice realiza la asignación a un segmento de la lista), nada que ver con la clasificación. Supongo que la abreviatura de "asignación" hace que el nombre sea divertido ...
Alex Martelli
3
La versión actual de listsort.txtagrega algunas notas que abordan las confusiones comunes.
Tim Peters
9

En las primeras versiones de Python, la función sort implementó una versión modificada de quicksort. Sin embargo, se consideró inestable y, a partir de la versión 2.3, cambiaron al uso de un algoritmo adaptable mergesort.

Silfverstrom
fuente
quicksort no se 'considera inestable' (según las definiciones de uso común, quicksort es inestable), es decir, el orden original de dos objetos no se conserva, si son iguales durante este tipo. Tener un algoritmo de ordenación inestable significa que debe idear todo tipo de 'magia' para ordenar los datos de manera sensata con múltiples criterios, en lugar de simplemente poder ordenar en cadena las llamadas, en timsort si desea ordenar por fecha de nacimiento y luego nombrar , simplemente ordena por nombre primero, y luego por fecha de nacimiento. No puedes hacer eso con quicksort
Tony Suffolk 66