In Julia this would read using broadcasting:
X = ones(Int, 1_000_000_000)
Y = ones(Int, 1_000_000_000)
# explicit dot notation
X .+= 2 .* Y
# or with a macro
@. X += 2 * Y
The + and * do not allocate, the operations are fused into element-wise operations so the vectors are traversed only once, and the loop is compiled to vectorized code. No need for Numpy / BLAS.