为什么Julia中的三角函数似乎比Numpy中的慢?

为什么Julia中的三角函数似乎比Numpy中的慢?,numpy,julia,Numpy,Julia,我是朱莉娅的新手,所以我可能做错了什么。但是我做了一个简单的三角函数测试,朱莉娅似乎比努比慢很多。需要一些帮助来了解原因 ---朱莉娅版本: x = rand(100000); y = similar(x); @time y.=sin.(x); ---Numpy版本: import numpy x = numpy.random.rand(100000) y = numpy.zeros(x.shape) %timeit y = numpy.sin(x) Julia版本通常给出1.3~1.5毫秒

我是朱莉娅的新手,所以我可能做错了什么。但是我做了一个简单的三角函数测试,朱莉娅似乎比努比慢很多。需要一些帮助来了解原因

---朱莉娅版本:

x = rand(100000);
y = similar(x);
@time y.=sin.(x);
---Numpy版本:

import numpy
x = numpy.random.rand(100000)
y = numpy.zeros(x.shape)
%timeit y = numpy.sin(x)
Julia版本通常给出1.3~1.5毫秒,而Numpy版本通常给出0.9~1毫秒。差异非常显著。为什么呢?谢谢

x = rand(100000);
y = similar(x);
f(x,y) = (y.=sin.(x));
@time f(x,y)
@time f(x,y)
@time f(x,y)
给予


第一次调用函数时,Julia会编译它。广播表达式生成并使用匿名函数,因此,如果在全局范围内广播,则每次都会编译它。Julia在函数范围内工作得最好。

永远不要在全局范围内进行基准测试,并检查Julia是否能够推断类型。在我看来,这些都不是真正有效的比较,但我已经有一段时间没有看到朱莉娅了。Julia中没有比使用
时间更好的基准测试工具吗?你应该期望Numpy和Julia在这类事情上的表现大致相同。尝试使用基准工具并插入变量。当我使用
@btime$y.=sin.($x)
时,我的速度比
@time y.=sin.(x)
快了大约30%。如果我写出循环并使用4个线程的多线程处理,我会在10^5个元素的情况下获得另外3.5倍的加速。但是令人惊讶的是,即使在改进了基准测试之后,我也看到了比您大得多的差异。Numpy在计算sin时的速度似乎是Julia的10倍,这很奇怪。在我的基准测试中,Python似乎使用多线程,这可能就是原因。这样做的好处只有在大向量上才明显@DNF-您能仔细检查一下您的机器吗?这可能是英特尔数学库(libimf)与OpenBLAS(libopenlibm)的问题吗?我曾经比较过sinh,发现libimf比libopenlibm快40%。不过,我觉得这与这里的问题无关。
julia> @time y.=sin.(x);
  0.123145 seconds (577.97 k allocations: 29.758 MiB, 5.70% gc time)

julia> @time y.=sin.(x);
  0.000515 seconds (6 allocations: 192 bytes)

julia> @time y.=sin.(x);
  0.000512 seconds (6 allocations: 192 bytes)