Skip to content

Commit 3c35470

Browse files
authored
reduce allocations in polynomial sum (#304)
* reduce allocations in polynomial sum * reduce allocations in multiplication
1 parent 496aabf commit 3c35470

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

src/polynomials/Polynomial.jl

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,29 +74,32 @@ julia> p.(0:3)
7474

7575
function Base.:+(p1::Polynomial{T}, p2::Polynomial{S}) where {T, S}
7676
n1, n2 = length(p1), length(p2)
77-
R = promote_type(T,S)
7877
if n1 > 1 && n2 > 1
7978
p1.var != p2.var && error("Polynomials must have same variable")
79+
end
80+
R = promote_type(T,S)
81+
c = zeros(R, max(n1, n2))
82+
if n1 > 1 && n2 > 1
8083
if n1 >= n2
81-
c = R.(copy(p1.coeffs))
82-
for i = 1:n2
84+
c .= p1.coeffs
85+
for i = eachindex(p2.coeffs)
8386
c[i] += p2.coeffs[i]
8487
end
8588
else
86-
c = R.(copy(p2.coeffs))
87-
for i = 1:n1
89+
c .= p2.coeffs
90+
for i = eachindex(p1.coeffs)
8891
c[i] += p1.coeffs[i]
8992
end
9093
end
9194
return Polynomial(c, p1.var)
9295
elseif n1 <= 1
93-
c = R.(copy(p2.coeffs))
94-
c[1] += p1[0]
95-
return Polynomial(c, p2.var)
96+
c .= p2.coeffs
97+
c[1] += p1[0]
98+
return Polynomial(c, p2.var)
9699
else
97-
c = R.(copy(p1.coeffs))
98-
c[1] += p2[0]
99-
return Polynomial(c, p1.var)
100+
c .= p1.coeffs
101+
c[1] += p2[0]
102+
return Polynomial(c, p1.var)
100103
end
101104
end
102105

@@ -113,9 +116,9 @@ function Base.:*(p1::Polynomial{T}, p2::Polynomial{S}) where {T,S}
113116
end
114117
return Polynomial(c, p1.var)
115118
elseif n <= 0
116-
return Polynomial(copy(p2.coeffs) * p1[0], p2.var)
119+
return Polynomial(p2.coeffs * p1[0], p2.var)
117120
else
118-
return Polynomial(copy(p1.coeffs) * p2[0], p1.var)
121+
return Polynomial(p1.coeffs * p2[0], p1.var)
119122
end
120123

121124
end

0 commit comments

Comments
 (0)