【发布时间】:2020-08-21 06:06:52
【问题描述】:
考虑这个 python 代码,我尝试计算向量到矩阵每一行的欧几里距离。与我使用 Tullio.jl 找到的最佳 Julia 版本相比,它非常慢。
python 版本需要 30s,而 Julia 版本只需要 75ms。
我确信我在 Python 方面做得不是最好的。有更快的解决方案吗?欢迎使用 Numba 和 numpy 解决方案。
import numpy as np
# generate
a = np.random.rand(4000000, 128)
b = np.random.rand(128)
print(a.shape)
print(b.shape)
def lin_norm_ever(a, b):
return np.apply_along_axis(lambda x: np.linalg.norm(x - b), 1, a)
import time
t = time.time()
res = lin_norm_ever(a, b)
print(res.shape)
elapsed = time.time() - t
print(elapsed)
朱莉娅版本
using Tullio
function comp_tullio(a, c)
dist = zeros(Float32, size(a, 2))
@tullio dist[i] = (c[j] - a[j,i])^2
dist
end
@time comp_tullio(a, c)
@benchmark comp_tullio(a, c) # 75ms on my computer
【问题讨论】:
-
此外,如果您使用链接问答答案中的方法#5,请在距离上使用
np.sqrt。使用方法 #2,cdist(matrix, np.atleast_2d(search_vec)).ravel(). -
您查看过链接的问答吗?方法#5 和方法#2 回答问题。如果没有,我错过了什么?如果你能证明那些不适合你,我很乐意重新开放。
-
在我的(非常新的 8 核)计算机上
comp_tullio需要 >400 毫秒。你运行了多少线程? -
我得到了 6 个线程,一年多前我从 Jsut 得到了一个 i7
-
我在 Windows 10 上使用 Julia 1.5。