2013-06-21 18 views
20

Ero curioso di sapere quale di operator.itemgetter(0) o lambda x:x[0] è meglio utilizzare, in particolare in sorted() come argomento di parole chiave key poiché è l'uso che viene in mente prima di tutto. Esistono differenze prestazionali note? Ci sono preferenze o indicazioni relative alla PEP in merito?operator.itemgetter o lambda

+1

vorrei consigliare di usare 'operator.itemgetter (0)' – oleg

+0

anche oltre la leggibilità standard? non è questo tipo di decisione basata sulle prestazioni che rende l'ottimizzazione prematura? – hexparrot

+0

@hexparrot è una differenza di codice così piccola, e non penso che la leggibilità sia migliore in un modo o nell'altro. Mi sto solo chiedendo per l'integrazione di qualsiasi cosa sia "migliore" nel mio lessico regolare. – Endophage

risposta

9

Lasciando da parte il problema di velocità, che spesso si basa sul punto in cui si esegue la funzione itemgetter o lambda, personalmente trovo che itemgetter sia davvero bello per ottenere più elementi contemporaneamente: ad esempio, itemgetter(0, 4, 3, 9, 19, 20) creerà una funzione che restituisce un passò ad esso la tupla degli oggetti agli indici specificati dell'oggetto listlike. Per farlo con un lambda, avresti bisogno di lambda x:x[0], x[4], x[3], x[9], x[19], x[20], che è molto clunkier. (. E poi alcuni pacchetti come numpy avere indicizzazione avanzata, che funziona un po 'come itemgetter() tranne costruito nel normale notazione staffa)

+0

+1 punto eccellente su più voci, certamente itemgetter è il vincitore lì. – Endophage

29

Le prestazioni di itemgetter è leggermente migliore:

>>> f1 = lambda: sorted(w, key=lambda x: x[1]) 
>>> f2 = lambda: sorted(w, key=itemgetter(1)) 
>>> timeit(f1) 
21.33667682500527 
>>> timeit(f2) 
16.99106214600033 
+0

+1 grazie per aver fornito l'aspetto delle prestazioni! – Endophage

+1

Ma qui ciò che viene misurato è la creazione delle funzioni lambda. Per misurare l'ordinamento stesso, le chiamate "timeit" dovrebbero essere "timeit (f1())" e "timeit (f2())". O mi sto perdendo qualcosa qui? – dojuba

+0

@dojuba 'timeit.timeit' chiama il suo argomento se non è una stringa. –

Problemi correlati