2010-04-24 4 views
18

Sto osservando un codice che ha molte chiamate di ordinamento che utilizzano funzioni di confronto e sembra che dovrebbe utilizzare le funzioni chiave.lambda vs. operator.attrgetter ('xxx') come funzione chiave di ordinamento in Python

Se si dovesse cambiare seq.sort(lambda x,y: cmp(x.xxx, y.xxx)), che è preferibile:

seq.sort(key=operator.attrgetter('xxx')) 

o:

seq.sort(key=lambda a:a.xxx) 

Vorrei anche essere interessati a commenti sul merito di apportare modifiche al codice esistente che funziona.

risposta

17

"Apportare modifiche al codice esistente che funziona" è come i programmi si evolvono ;-). Scrivi una buona batteria di test che danno risultati noti con il codice esistente, salva quei risultati (che sono normalmente noti come "file dorati" in un contesto di test); quindi apporta le modifiche, riesegui i test e verifica (idealmente in modo automatico) che le uniche modifiche ai risultati dei test siano quelle che sono specificatamente destinate allo, senza effetti collaterali indesiderati o imprevisti. Si possono usare strategie di assicurazione della qualità più sofisticate, ovviamente, ma questo è il succo di molti approcci di "test di integrazione".

Per quanto riguarda i due modi per scrivere la semplice funzione key=, l'intento progettuale era di rendere operator.attrgetter più veloce essendo più specializzato, ma almeno nelle attuali versioni di Python non c'è alcuna differenza misurabile in termini di velocità. Stando così le cose, per questa situazione speciale raccomanderei lo lambda, semplicemente perché è più conciso e generale (e di solito non sono un amante del lambda, intendiamoci!).

+7

concordo con la risposta di alex (cioè non è un amante lambda) :-) ma anche secondo la nozione di lambda. nel tuo esempio sopra, potrebbe essere un po 'più veloce perché non devi cercare "operatore" o "operatore.attrgetter()" ... hai già l'oggetto funzione reale! tuttavia, è quasi impercettibile come già detto da alex, ma la soluzione 'lambda' conquista i punti Python Zen essendo più facile da leggere. – wescpy

+0

Grazie, Alex e Wesley! – PaulMcG

Problemi correlati