Skip to content

Commit 2dc55e9

Browse files
committed
Update reduce.jl
Update reduce.jl
1 parent 00202f7 commit 2dc55e9

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

base/reduce.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,19 @@ end
437437

438438
mapreduce(f, op, a::Number) = mapreduce_first(f, op, a)
439439

440-
_mapreduce(f, op, ::IndexCartesian, A::AbstractArrayOrBroadcasted) = mapfoldl(f, op, A)
440+
function _mapreduce(f, op, ::IndexCartesian, A::AbstractArrayOrBroadcasted)
441+
ndims(A) <= 1 && return _mapreduce(f, op, IndexLinear(), A)
442+
size(A, 1) < 16 && return mapfoldl(f, op, A)
443+
ax1, axo = Base.axes1(A), tail(axes(A))
444+
IA, outer = Iterators.peel(CartesianIndices(axo))
445+
@inline elf(i) = @inbounds f(A[i, IA])
446+
r = mapreduce_impl(elf, op, ax1, firstindex(ax1), lastindex(ax1))
447+
for IA in outer
448+
r′ = mapreduce_impl(elf, op, ax1, firstindex(ax1), lastindex(ax1))
449+
r = op(r, r′)
450+
end
451+
r
452+
end
441453

442454
"""
443455
reduce(op, itr; [init])

0 commit comments

Comments
 (0)