Trasformare una matrice in un'altra: un ciclo for o una mappa funzionale?

2

Esteticamente e matematicamente una funzione di mappa (f, X) sembra grande: in soli due argomenti dice cosa sta per succedere: useremo la funzione f per trasformare ogni elemento da X per creare una nuova matrice Y .

Tuttavia, non so cosa stia succedendo sotto il cofano di per o mappa ; e le mie ragioni per apprezzare la mappa potrebbero essere considerate superficiali. Uno è più efficiente dell'altro?

Nota: la domanda non riguarda la micro-ottimizzazione: la domanda è un ampio confronto (multi-criterio) tra due metodi specifici (che sembrano raggiungere lo stesso obiettivo) e perché si dovrebbe usare l'uno o l'altro.

    
posta A.L. Verminburger 17.08.2017 - 10:02
fonte

4 risposte

8

Il 97% delle volte dovresti usare quello che è più facile da capire e quindi più facile da correggere.

Vorrei anche notare che c'è anche un problema di dati mutevoli immutabili vs mutevoli qui. map è sempre immutabile e restituirà sempre una nuova raccolta di cose, for può o non può essere usato immutabilmente.

Mi inclino all'immutabilità come più facile ottenere il corretto passaggio a una soluzione mutabile solo se fosse necessario. Mi piacerebbe quindi utilizzare map in quanto esprime meglio questo intento.

    
risposta data 17.08.2017 - 18:27
fonte
1

map ha altri vantaggi, il più grande dei due è che per i loop non hanno tipi di ritorno e non possono essere parte di una pipeline ponderata pigramente. Il primo vantaggio significa che il compilatore ti aiuterà a sottolineare più in anticipo i tuoi errori. Il secondo vantaggio significa che puoi scrivere un codice come questo (in Scala):

giantArray.view map f find {_ == 3}

Poiché un view viene valutato pigramente, f verrà eseguito solo su tutti gli elementi di giantArray necessari per trovare un risultato di 3 . Questo è decisamente più efficiente della conversione dell'intero array, ma puoi scrivere il tuo codice come se avessi convertito l'intero array, il che rende molto più semplice scrivere.

    
risposta data 17.08.2017 - 13:08
fonte
1

Ottimizza la leggibilità prima di tutto. Non è solo superficiale. Riduce il disordine e accelera / migliora lo sviluppo.

Alla fine, stai cercando di comunicare al lettore che è in corso un'operazione di mappatura.

Nel caso di map , è immediatamente evidente che l'operazione di mappatura è in corso.

Nel caso di un caso for , non è immediatamente chiaro. Il lettore dovrà pensare al codice per un po 'prima di identificarlo come una mappatura. Aggiunge un ulteriore passaggio.

Sul tema delle prestazioni, nel caso del ciclo for , le persone dimenticano molto spesso di riservare la capacità necessaria nel loro array di risultati. Di conseguenza, le aggiunte ripetute alla matrice comportano un sovraccarico di riallocazione.

Qualsiasi implementazione decente di map istanzia automaticamente un'array di output almeno grande quanto l'array di input su cui è stato chiamato. Se l'array risultante è immutabile, l'array di output può avere esattamente le stesse dimensioni dell'input (senza preoccuparsi degli inserimenti futuri). È una cosa in meno da dimenticare.

    
risposta data 18.08.2017 - 19:19
fonte
0

Il mapping di tutti gli elementi da una matrice a una nuova è un processo O(n) in un modo o nell'altro con un sovraccarico minimo. In effetti, molte implementazioni di una funzione map useranno semplicemente un ciclo for dietro le quinte! Quindi raramente ci sarà una differenza di performance non trascurabile tra l'utilizzo di un ciclo for o la chiamata a una funzione map .

    
risposta data 17.08.2017 - 17:27
fonte

Leggi altre domande sui tag