Clojure: azaltmak vs Uygula
reduce
apply
kavramları arasındaki farkı anlıyorum:
(reduce (list 1 2 3 4 5))
; translates to: ( ( ( ( 1 2) 3) 4) 5)
(apply (list 1 2 3 4 5))
; translates to: ( 1 2 3 4 5)
Ancak, hangisi daha deyimsel clojure? Çok fark öyle ya da böyle yapar mı? (Sınırlı) performans testleri, reduce
biraz daha hızlı gibi görünüyor.
CEVAP
reduce
apply
değişken parametre durumda tüm değişkenleri görmek için ihtiyacı olan ilişkisel fonksiyonlar için ders eşdeğer (nihai sonuç verdiğini açısından). Ne zaman onlar neden-bilge eşdeğer diyebilirim apply
her zaman mükemmel deyimsel, reduce
eşdeğer ve belki traş bir kısmını bir göz açıp kapayıncaya kadar geçiyor ... çok yaygın durumda. Aşağıda buna inanmak için benim mantığı.
değişken parametre dava için reduce
açısından (2'den fazla bağımsız değişken) kendisi de uygulanır. Gerçekten de, bu gibi görünüyor bir derece mantıklı "varsayılan" yol gitmek için herhangi bir değişken parametre, ilişkisel işlevi: reduce
olan potansiyelini gerçekleştirmek için bazı iyileştirmelere hızlandırmak için -- belki bir şey gibi internal-reduce
1.2 yenilik yakın zamanda devre dışı master, ama umarım olmak girmesini içinde gelecek olan olur saçma çoğaltmak her işlevi olabilir parası onlara dava sırasında. Bu ortak durumlar, apply
sadece küçük bir yük ekleyecektir. (Bu konuda çok endişelenmeye gerek yok not.)
Öte yandan, karmaşık bir fonksiyon olabilir yararlanmak bazı optimizasyon fırsatları olan değil genel olacak kadar inşa halinde reduce
; apply
ki izin almak avantaj bu süre reduce
olabilir aslında yavaş aşağı. İyi bir örnek, ikinci senaryo, çözümleri uygulama tarafından sağlanan str
: kullanır StringBuilder
dahili ve yararına önemli ölçüde kullanımı apply
yerine reduce
.
Yani, diyebilirim kullanın. apply
ne zaman şüphe; ve biliyor musun bu değil satın almak bir şey üzerinde reduce
(ve bu olası değişim çok yakında), çekinmeyin kullanın. reduce
traş küçük gereksiz yük olduğunu düşünüyorsan.
Azaltmak, kat veya tarama (Sol/SaÄŸ)?...
Nasıl Filtre, Harita kullanımı ve Pyth...
Clojure Huzurlu bir web hizmeti geliÅŸt...
Nasıl gecikme başlangıç AVPlayer iOS a...
Bir JavaScript başlatmasını prototip ç...