क्लोजर में butlast
और drop-last
के बीच क्या अंतर है?क्लोजर ब्यूट्लास्ट बनाम ड्रॉप-आखिरी
क्या यह केवल आलस्य है? क्या मुझे एक दूसरे को पसंद करना चाहिए?
क्लोजर में butlast
और drop-last
के बीच क्या अंतर है?क्लोजर ब्यूट्लास्ट बनाम ड्रॉप-आखिरी
क्या यह केवल आलस्य है? क्या मुझे एक दूसरे को पसंद करना चाहिए?
भी, अगर आप पूरे संग्रह का एहसास करने की जरूरत है, butlast
नाटकीय रूप से तेजी से है, जो तार्किक है अगर आप अपने स्रोत को देखो है। यहां एक छोटा सा उदाहरण दिया गया है:
user> (time (let [_ (butlast (range 10000000))]))
"Elapsed time: 2052.853726 msecs"
nil
user> (time (let [_ (doall (drop-last (range 10000000)))]))
"Elapsed time: 14072.259077 msecs"
nil
इसलिए मैं अंधेरे से किसी एक को पसंद नहीं करता। मैं केवल drop-last
का उपयोग करता हूं जब मुझे वास्तव में आलस्य की आवश्यकता होती है, अन्यथा butlast
।
हां, आलस्य और साथ ही तथ्य यह है कि drop-last
n
भी ले सकता है, यह दर्शाता है कि कितने तत्व आलसी से गिरने के लिए छोड़ते हैं।
वहाँ एक चर्चा here जहां किसी कि butlast
अधिक पठनीय और लिस्प प्रोग्रामर के लिए शायद एक परिचित मुहावरा है मामले बना रही है, लेकिन मैं आम तौर पर सिर्फ drop-last
उपयोग करने के लिए चुनते हैं।
(def
butlast (fn ^:static butlast [s]
(loop [ret [] s s]
(if (next s)
(recur (conj ret (first s)) (next s))
(seq ret)))))
(defn drop-last
([s] (drop-last 1 s))
([n s] (map (fn [x _] x) s (drop n s))))
तो drop-last
का उपयोग करता map
, जबकि butlast
recur
के साथ सरल यात्रा का उपयोग करता है: