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
risposta
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)
+1 punto eccellente su più voci, certamente itemgetter è il vincitore lì. – Endophage
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
+1 grazie per aver fornito l'aspetto delle prestazioni! – Endophage
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
@dojuba 'timeit.timeit' chiama il suo argomento se non è una stringa. –
- 1. Ordinamento del dizionario utilizzando operator.itemgetter
- 2. Perché dovrei usare operator.itemgetter (x) invece di [x]?
- 3. È Linq o Lambda?
- 4. query Linq o espressione lambda?
- 5. MethodInvoke delegato o espressione lambda
- 6. Espressione lambda o riferimento metodo?
- 7. Come convertire il metodo o lambda in non-lambda proc
- 8. Cos'è (lambda lambda lambda)?
- 9. sottoquery in un'espressione lambda o LINQ
- 10. query SQL per l'espressione lambda o LINQ
- 11. Seleziona dalla lista Lambda o linq
- 12. Espressione Lambda contro affermazione Lambda
- 13. Java 8 lambda per Kotlin lambda
- 14. Passo lambda espressione all'argomento lambda C++ 11
- 15. Modifica dell'ultimo minuto nella sintassi Lambda o bug di gcc?
- 16. Rimuovere le istanze da un elenco utilizzando LINQ o Lambda?
- 17. Acquisizione lambda: per utilizzare l'inizializzatore o non usarlo?
- 18. Equivalente di SQL tra istruzione usando Linq o un'espressione Lambda
- 19. utilizzata nell'espressione lambda deve essere definitiva o efficace finale
- 20. C++ 14 Lambda - Cattura condizionale per riferimento o valore
- 21. Raggruppamento di oggetti con espressione linq o lambda
- 22. Impossibile utilizzare il parametro ref o out nelle espressioni lambda
- 23. Le espressioni lambda/delegate in C# "puro" o possono essere?
- 24. Utilizzo di noexcept come modificatore lambda o vincolo parametro
- 25. Devo lanciare nella mia lambda o lanciare IEnumerable?
- 26. Completezza di lambda del calcolo lambda?
- 27. Lambda-Over-Lambda in C++ 14
- 28. Chiarimento Lambda
- 29. Cosa c'è di più interessante o potente: Curry, Mercury o Lambda-Prolog?
- 30. Passare un'espressione lambda al posto di IComparer o IEqualityComparer o qualsiasi interfaccia a metodo singolo?
vorrei consigliare di usare 'operator.itemgetter (0)' – oleg
anche oltre la leggibilità standard? non è questo tipo di decisione basata sulle prestazioni che rende l'ottimizzazione prematura? – hexparrot
@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