(doseq [e coll1]
(myfunc e))
ist sehr schnell, wenn alles, was Sie interessieren, Nebenwirkungen sind. Was, wenn ich myfunc
Elemente aus mehreren Sammlungen "parallel" nehmen möchte, d. H. myfunc
auf die ersten Elemente jeder Sammlung anwenden, dann auf alle zweiten Elemente, dann auf alle dritten Elemente usw.? Beachten Sie, dass dies genauso eine Frage über die Funktionalität von for
als doseq
ist, aber wenn man eine Sequenz als Ausgabe wünscht, wird map
tun, was benötigt wird, also for
ist nicht notwendig.Effizienter Weg, Sammlungen parallel mit doseq (oder für) zu gehen?
(doseq [e1 coll1
e2 coll2]
(myfunc e1 e2))
stattdessen myfunc
auf alle möglichen Kombinationen von Elementen aus den beiden Sammlungen gelten. Wenn ich im Voraus weiß, was die Elemente der Sammlung sein werden, könnte ich einen :when
Test verwenden, um nur bestimmte Elemente zu kombinieren, aber angenommen, dass ich das nicht weiß?
Eine Lösung ist ntuples zu erstellen, um das cartesianischen Produkt zu vermeiden, aber das ist zeitraubend, der den Geschwindigkeitsvorteil Entfernen doseq
in erster Linie mit:
(let [argvecs (map vector coll1 coll2)] ; seq of ntuples of interleaved vals
(doseq [args argvecs]
(apply myfunc args))))
(Hier geht es um 8X als ein langsamer sein kann . Single-Sammlung doseq
Siehe Zeiten für domap1
und domap17
am Ende this question)
Nützliche Punkte über 'apply' - Danke. In Experimenten, die ich mit "recur" gemacht habe (siehe Link in der Frage), ist es langsamer als "doseq" für eine einzelne Sammlung, also würde ich nicht erwarten, dass es besser ist als eine Paralleliteration 'doseq'. – Mars
In der anderen Frage, die ich von diesem Split abbrachte, bewertete ich einen Zielaritäts- gegen Varargs-Vergleich mit Loop/Recurve und es gab einen Leistungsunterschied von ~ 150%. Der Leistungsunterschied zwischen Loop-/Recur- und Dorun-Maps in großen Sammlungen war extrem. – noisesmith
Eines Tages könnte ich die 'doseq' Quelle kopieren, Code für komplexe' für' Optionen wie ': while' ausstreichen und es parallel durchlaufen lassen, ohne ein kartesisches Produkt zu erstellen. Eines Tages. Könnte sein. Sieht mir zur Zeit ziemlich haarig aus. Ich werde nie so viel über Clojure Eingeweide erfahren. – Mars