2012-03-25 10 views
6

ho recentemente notato che c'era una chiara attuazione di inserzione qui:Fare un elenco "unlazy" in clojure

Insertion sort in clojure throws StackOverFlow error

  • che soffre di overflow di memoria, a causa del fatto che concat pigramente si unisce alle liste. Mi chiedevo:

Quali strategie possiamo applicare per "desquamazione" di un elenco quando vogliamo prestazioni migliori su grandi collezioni?

+0

Hmm ... Dopo un po 'più googling, è chiaro che la semplice risposta a questa domanda è utilizzando la funzione "doall" per avvolgere la raccolta. Tuttavia, presumo che qui potrebbero esserci dei trucchi che potrebbero essere utili da conoscere. – jayunit100

risposta

5

doall va bene per forzare la valutazione pigra.

Un'altra cosa utile da ricordare è che reduce non è pigro. Questo può quindi essere molto utile nei calcoli di grandi dimensioni per garantire che i risultati intermedi vengano valutati e ridotti a un singolo valore di output prima che il calcolo proceda.

+0

Non capisco il downvote. 'doall' farà il lavoro e un' reduce' accumulando in un vettore fornisce anche una soluzione, che non dovrebbe essere liquidata immediatamente. Il risultato ha un accesso casuale rapido che potrebbe essere interessante per alcune applicazioni. (Ciò detto: un 'vec' attorno alla sequenza risultante darebbe anche lo stesso risultato.) – kotarak

+0

Sono d'accordo che tutto funzionerebbe ... In effetti, ha funzionato l'ho provato subito dopo aver postato questa domanda, riguardo l'altro post di riferimento . Per favore, commenta. – jayunit100