No.
La tua funzione non fornisce risposte coerenti su come ordinare i numeri, perché greater(x, y) != not greater(y, x)
per alcuni valori di x e y. Ad esempio (3 % 4) % 2 == 1
e (4 % 3) % 2 == 1
anche! Ciò significa che 3 > 4
AND 3 < 4
, che è una sciocchezza. Se lo converti in una funzione in stile cmp come suggerisce @SystemDown, otterrai risultati incoerenti. Ad esempio:
>>> sorted(range(3, 6), cmp=greater)
[5, 4, 3]
>>> sorted(range(1, 6), cmp=greater)
[1, 4, 3, 5, 2]
Qui 5 è più piccolo di 4 in un caso ma più grande di 4 in un altro, usando la stessa funzione di comparazione!
Anche se la tua funzione cmp fosse coerente, ti consiglio di non utilizzarla in alcun modo o forma, ad esempio usando la funzione cmp_to_key
suggerita da @zstewart, perché una funzione cmp è più lenta da leggere e eseguire il debug di più una funzione chiave equivalente.
Usando le funzioni chiave, la funzione viene chiamata una sola volta per elemento da ordinare, quindi se hai un elenco di 1 milione di elementi, viene chiamato un milione di volte. Quindi lo smistamento procede e confronta i valori di ritorno della funzione chiave n*log(n)
volte, in media. Per un elenco di 1 milione di elementi, vale 13,8 milioni di volte.
Se invece usi una funzione cmp, viene chiamata una volta per ognuno di quei confronti n*log(n)
! Di nuovo, questo è 13,8 milioni di volte se la lista contiene 1 milione di elementi. Se utilizzi cmp_to_key
, otterrai un ulteriore sovraccarico di creazione di istanze di 1 milione di istanze di una classe helper.
Ho provato con un elenco di 1 milione di numeri casuali usando queste funzioni, che hanno lo stesso risultato:
def cmp_func(a, b):
if a > b:
return -1
elif a < b:
return 1
else:
return 0
def key_func(x):
return -x
L'ordinamento con key_func
ha richiesto 1,35 s, mentre è stato utilizzato cmp_func
richiesto 2,43 s.
Quindi per rispondere alla domanda implicita di @lzkata, è stata ritenuta una buona idea rimuovere l'argomento cmp da ordinare in 3.x perché
Le funzioni - cmp sono inclini a produrre risultati incoerenti in modi sottili, risultanti in bug sottili e difficili da trovare
Le funzioni - cmp sono più lente
- è quasi sempre possibile convertire una funzione cmp in una funzione chiave con prestazioni migliori