Harika bir soru @tparker ve mükemmel cevap @ColinTBowers. İkisini de düşünmeye çalışırken, düz-ileri eski-okul Julian-of-the-for
-loop'u denememi sağladı. Sonuç, aynı elemanların uzun bir vektörünün önemli girdilerinde daha hızlıydı, bu yüzden bu notu ekliyorum. Ayrıca, allequal
işlev adı, belirtilmesi için yeterli görünüyor.
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
Ve kriter: Yani burada varyantlardır
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)
GÜNCELLEME: Bir kısa devre fırsat varken kriter için bir diğer önemli durumdur. Yani (aynı COMMMENT istenilen):
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)
ikinci versiyonu allequal_2
ücretleri kötü değil kısa devre yaptığı gibi.
Her şey eşittir, for
sürümü Base'de allequal
olmalıdır.
Teşekkürler, 'foldl' tam aradığım işlevdir.Üçüncü uygulamanın neden daha hızlı olduğu için 'inbounds'un ötesinde bir sebep olduğunu düşünüyor musunuz? – tparker
Julia Base'in, genel işlevlerin bir araya getirilmesi ve üzerine inşa edilmesiyle nasıl inşa edildiğini gerçekten çok seviyorum. Örneğin, 'reduction.jl' dosyasına bakın. Bir “allequal” ın (aslında Base'de olmamasına rağmen) bazı hiper-optimize özel döngü yapmak yerine, “all” gibi bazı jenerik yapıların üzerine inşa edilmesini tercih ederim. Bu şekilde, "herkesin" performansının iyileştirilmesi, ona bağlı olan her işlevi geliştirecektir. – DNF
BTW. 'foldl' _not_ kısa devre yapıyor, bu yüzden burada kesinlikle uygun değil. – DNF