【发布时间】:2021-04-04 16:57:31
【问题描述】:
在 Python 中,通常建议将代码向量化以加快计算速度。例如,如果你想计算两个向量的内积,比如a 和b,通常是
代码 A
c = np.dot(a, b)
优于
代码 B
c = 0
for i in range(len(a)):
c += a[i] * b[i]
但在 Julia 中,有时矢量化似乎没那么有用。我将'* 和dot 视为矢量化版本,将显式for 循环视为非矢量化版本,并得到以下结果。
using Random
using LinearAlgebra
len = 1000000
rng1 = MersenneTwister(1234)
a = rand(rng1, len)
rng2 = MersenneTwister(12345)
b = rand(rng2, len)
function inner_product(a, b)
result = 0
for i in 1: length(a)
result += a[i] * b[i]
end
return result
end
@time a' * b
@time dot(a, b)
@time inner_product(a, b);
0.013442 seconds (56.76 k allocations: 3.167 MiB)
0.003484 seconds (106 allocations: 6.688 KiB)
0.008489 seconds (17.52 k allocations: 976.752 KiB)
(我知道使用BenchmarkTools.jl 是衡量性能的更标准方法。)
从输出结果来看,dot 的运行速度比 for 快于 '*,这与假设的情况相矛盾。
所以我的问题是,
- Julia 是否需要(或有时需要)矢量化来加快计算速度?
- 如果是,那么何时使用矢量化以及哪种方法更好(考虑
dot和'*)? - 如果不是,那么在矢量化和非矢量化代码的机制方面,Julia 和 Python 有什么区别?
【问题讨论】:
标签: python-3.x julia vectorization