महान प्रश्न @tparker और महान उत्तर @ कोलिंटबावर। दोनों के बारे में सोचने की कोशिश करते समय, यह सीधे-आगे पुराने स्कूल जूलियन तरीके-के -for
-loop को आजमाने के लिए हुआ। नतीजा समान तत्वों के लंबे वेक्टर के महत्वपूर्ण इनपुट पर तेजी से था, इसलिए मैं यह नोट जोड़ रहा हूं। साथ ही, फ़ंक्शन का नाम allequal
उल्लेख करने के लिए पर्याप्त उचित प्रतीत होता है।
allequal_1(x) = all(y->y==x[1],x)
allequal_2(x) = foldl(==,x) # another way but doesn't short-circuit :(
@inline function allequal_3(x)
length(x) < 2 && return true
e1 = x[1]
i = 2
@inbounds for i=2:length(x)
x[i] == e1 || return false
end
return true
end
और बेंचमार्क: तो यहाँ वेरिएंट हैं
julia> using BenchmarkTools
julia> v = fill(1,10_000_000); # long vector of 1s
julia> allequal_1(v)
true
julia> allequal_2(v)
true
julia> allequal_3(v)
true
julia> @btime allequal_1($v);
9.573 ms (1 allocation: 16 bytes)
julia> @btime allequal_2($v);
10.585 ms (0 allocations: 0 bytes)
julia> @btime allequal_3($v);
6.853 ms (0 allocations: 0 bytes)
अद्यतन: है जब वहाँ एक शॉर्ट सर्किट अवसर बेंचमार्क के एक अन्य महत्वपूर्ण मामला है। तो (के रूप में commment में अनुरोध):
julia> v[100] = 2
2
julia> allequal_1(v),allequal_2(v),allequal_3(v)
(false, false, false)
julia> @btime allequal_1($v);
108.946 ns (1 allocation: 16 bytes)
julia> @btime allequal_2($v);
10.325 ms (0 allocations: 0 bytes)
julia> @btime allequal_3($v);
68.221 ns (0 allocations: 0 bytes)
दूसरे संस्करण allequal_2
किरायों बुरी तरह के रूप में यह नहीं शॉर्ट सर्किट है।
सभी चीजें बराबर होती हैं, for
संस्करण बेस में allequal
होना चाहिए।
स्रोत
2017-11-30 16:54:19
धन्यवाद, 'फ़ोल्ड' वास्तव में वह फ़ंक्शन है जिसे मैं ढूंढ रहा था।क्या आपको लगता है कि तीसरा कार्यान्वयन तेज क्यों है, '@ इनबाउंड्स' से परे कारण है? – tparker
मुझे वास्तव में पसंद है कि जूलिया बेस का निर्माण सामान्य कार्यों के शीर्ष पर संयोजन और निर्माण करके किया जाता है, जिससे कई कार्यान्वयन उच्च-स्तर और अमूर्त होते हैं। उदाहरण के लिए 'reduce.jl' देखें। मैं पसंद करता हूं कि एक 'allequal' (हालांकि यह वास्तव में आधार में नहीं होना चाहिए) ऐसा कुछ होगा, जो कि कुछ हाइपर-अनुकूलित कस्टम लूप बनाने के बजाय' सभी 'जैसे कुछ सामान्य निर्माण के शीर्ष पर बनाया गया है। इस तरह, 'all' के प्रदर्शन में सुधार करने से प्रत्येक फ़ंक्शन में सुधार होगा जो उस पर निर्भर करता है। – DNF
बीटीडब्ल्यू। 'foldl' _not_ शॉर्ट-सर्किट में दिखाई देता है, इसलिए यह निश्चित रूप से इष्टतम नहीं है। – DNF