【发布时间】:2019-12-02 00:16:35
【问题描述】:
有很多关于 Julia 中速度矢量化和去矢量化代码的帖子,但我的问题是关于我在 Python 和 Julia 中运行的一段非常简单的代码来比较性能。我有一个巨大的 Python 代码,当且仅当像这样的函数显着加速时,我会将其转录给 Julia。
我在 Jupyter 笔记本中运行所有内容,并且我知道 Julia 在 .jl 文件中运行得更快;但是,我与从终端运行相比,这种情况下的差异可以忽略不计。
Python 代码使用广播和矢量化:
def test(x0,dx,i):
q = np.arange(-x0,x0,dx)
z = np.zeros(shape=(i,len(q)), dtype=np.complex128)
B = np.exp(-1j*q)
for s in range(1,i):
A = np.exp(-(q-q[:,np.newaxis])**2)*np.exp(-1j*s*q)
z[s] = B*np.sum(A,axis=1)*dx
return z
在 Julia 翻译中,我尝试使用 for 循环,但最终使用了一次理解,因为它比另一个 for 循环更快::
function test(x0,dx,n)
z = zeros(ComplexF64, (n, Int(2*x0/dx + 1)))
B = exp.(-1im*(-x0:dx:x0-dx))
for s in 1:n-1
for (i,q) in enumerate(-x0:dx:x0-dx)
A = [exp(-(q-Q)^2)exp(-1im*s*Q) for Q in -x0:dx:x0-dx]
z[s,i] = B[i]*sum(A)*dx
end
end
z
end
结果是
%timeit test(10,.1,10)
每个循环 2.81 毫秒 ± 247 微秒(平均值 ± 标准偏差,7 次运行,每次 100 次循环)
@btime test(10,.1,10)
55.075 毫秒(2176212 次分配:61.20 MiB)
也就是说,Julia 代码要慢得多。我绝对确定我在这里做错了什么,因为分配不应该那么大。我试图尽可能地优化它,但我几天前开始学习 Julia,并且无法走得更远。非常感谢任何有关如何提高性能的提示。
【问题讨论】:
标签: python-3.x optimization julia vectorization