[नोट: शीर्षक और पाठ को अधिक स्पष्ट करने के लिए संपादित किया गया था कि मैं विशेष रूप से स्ट्रिंग के बाद नहीं हूं, लेकिन सामान्य अनुक्रमों के बाद, और आलसी प्रसंस्करण एक ही]एक आइटम में एक अनुक्रम के कई संगत वस्तुओं को आलसी ढंग से पतन करने का सबसे अच्छा तरीका
चरित्र दृश्यों का उपयोग करते हुए/एक उदाहरण के रूप तार, कहते हैं कि मैं की तरह
एक स्ट्रिंग चालू करने के लिए "चाहते हैं \ टा \ r s \ टीडी \ t \ r \ n च \ r \ n asdf "
अधिक सामान्य शब्दों में"
में
", मैं सभी सन्निहित खाली स्थान के (या किसी अन्य arbitray चालू करना चाहते हैं वस्तुओं का सेट) एक ही क्रम में अनुक्रम में, और वह आलसी।
मैं निम्नलिखित विभाजन-द्वारा/मैपकैट कॉम्बो के साथ आया हूं, लेकिन आश्चर्य कीजिए कि क्या एक ही चीज़ को पूरा करने के लिए आसान या अन्यथा बेहतर तरीके (पठनीयता, प्रदर्शन, कुछ भी) हैं।
(defn is-wsp?
[c]
(if (#{\space \tab \newline \return} c) true))
(defn collapse-wsp
[coll]
(mapcat
(fn [[first-elem :as s]]
(if (is-wsp? first-elem) [\space] s))
(partition-by is-wsp? coll)))
कार्रवाई में:
=> (apply str (collapse-wsp "\t a\r s\td \t \r \n f \r\n"))
" a s d f "
अद्यतन: मैं तार/चरित्र दृश्यों/WSP इस्तेमाल किया, एक उदाहरण के रूप में, लेकिन क्या मैं वास्तव में चाहते हैं किसी भी प्रकार के दृश्यों पर एक सामान्य समारोह है कि संगत वस्तुओं की मनमानी संख्याओं को ध्वस्त कर देता है, जो कुछ पूर्वनिर्धारित आइटम द्वारा वस्तुओं के पूर्वनिर्धारित सेट का हिस्सा हैं। मुझे विशेष रूप से यह जानने में दिलचस्पी है कि विभाजन-द्वारा/मैपकैट के बेहतर विकल्प हैं, अगर इसे 'स्ट्रिंग' विशेष मामले के लिए अनुकूलित किया जा सकता है तो इतना नहीं।
अद्यतन 2: - ऊपर एक, पूरी तरह से आलसी नहीं है मुझे डर है, के अलावा है कि यह निरर्थक कर रहा है-WSP
यहाँ एक पूरी तरह से आलसी संस्करण है? जाँच करता है। मैंने पैरामीटर नाम इत्यादि को सामान्यीकृत किया है, इसलिए यह ऐसा कुछ नहीं दिखता है जिसे आप आसानी से स्ट्रिंग द्वारा प्रतिस्थापित कर सकते हैं। जो भी() कॉल - यह मनमाने ढंग से अनुक्रमों के बारे में है।
(defn lazy-collapse
([coll is-collapsable-item? collapsed-item-representation] (lazy-collapse coll is-collapsable-item? collapsed-item-representation false))
([coll is-collapsable-item? collapsed-item-representation in-collapsable-segment?]
(let [step (fn [coll in-collapsable-segment?]
(when-let [item (first coll)]
(if (is-collapsable-item? item)
(if in-collapsable-segment?
(recur (rest coll) true)
(cons collapsed-item-representation (lazy-collapse (rest coll) is-collapsable-item? collapsed-item-representation true)))
(cons item (lazy-collapse (rest coll) is-collapsable-item? collapsed-item-representation false)))))]
(lazy-seq (step coll in-collapsable-segment?)))))
यह तेजी से, पूरी तरह से आलसी है, लेकिन मुझे लगता है कि व्यक्त करने के लिए और अधिक संक्षेप में, के रूप में मैं काफी आलसी अपने आप को कर रहा हूँ में सक्षम होना चाहते हैं। आलसी collapsers की
मानक अब तक: चाहे कोड पठनीय या आसान कोड को देखकर न्यायाधीश करने, लेकिन आदेश को देखने के लिए कैसे वे प्रदर्शन के मामले में तुलना, यहाँ मेरी मानक हैं में नहीं है।मैं पहली बार जाँच समारोह करता है, तो क्या यह करने के लिए माना जाता है, और फिर मैं बाहर थूक कितना समय
- आलसी seq बनाने के लिए 1M बार
- आलसी seq बना सकते हैं और लेने के पहले आइटम 1M बार लेता है
- आलसी seq बना सकते हैं और दूसरे मद 1M बार
- ले आलसी seq बना सकते हैं और अंतिम आइटम ले (यानी पूरी तरह से आलसी seq एहसास) 1M बार
टेस्ट 3 के माध्यम से 1 गेज के लिए होती हैं आलस्य कम से कम एक ली थोड़ा सा मैंने परीक्षण को दो बार भाग लिया, और निष्पादन समय में कोई महत्वपूर्ण बदलाव नहीं था।
user=> (map
(fn [collapse]
(println (class collapse) (str "|" (apply str (collapse test-str is-wsp? \space)) "|"))
(time (dotimes [_ 1000000] (collapse test-str is-wsp? \space)))
(time (dotimes [_ 1000000] (first (collapse test-str is-wsp? \space))))
(time (dotimes [_ 1000000] (second (collapse test-str is-wsp? \space))))
(time (dotimes [_ 1000000] (last (collapse test-str is-wsp? \space)))))
[collapse-overthink collapse-smith collapse-normand lazy-collapse])
user$collapse_overthink | a s d f |
"Elapsed time: 153.490591 msecs"
"Elapsed time: 3064.721629 msecs"
"Elapsed time: 4337.932487 msecs"
"Elapsed time: 24797.222682 msecs"
user$collapse_smith | a s d f |
"Elapsed time: 141.474904 msecs"
"Elapsed time: 812.998848 msecs"
"Elapsed time: 2112.331739 msecs"
"Elapsed time: 10750.224816 msecs"
user$collapse_normand | a s d f |
"Elapsed time: 314.978309 msecs"
"Elapsed time: 1423.779761 msecs"
"Elapsed time: 1669.660257 msecs"
"Elapsed time: 8074.759077 msecs"
user$lazy_collapse | a s d f |
"Elapsed time: 169.906088 msecs"
"Elapsed time: 638.030401 msecs"
"Elapsed time: 1195.445016 msecs"
"Elapsed time: 6050.945856 msecs"
नीचे की रेखा अब तक: सबसे अच्छा कोड सबसे धीमा है, सबसे ऊंचा कोड सबसे तेज़ है। मुझे पूरा यकीन है कि यह इस तरह से नहीं होना चाहिए ...
लगभग एक साल बाद, मुझे अपना जवाब स्वीकार करने दें। यह सबसे तेज़ नहीं है, लेकिन शायद प्रदर्शन और संक्षिप्तता/पठनीयता के बीच एक अच्छा समझौता हो सकता है। – SuperHorst