我经常使用Python for ML,并且对转换为Julia很感兴趣,因为它在速度上有很大的改进。为了感受一下,我刚刚用Python和Julia编写了一个简单的循环,以便比较两者的运行时间,但是我似乎在Julia实现中得到了意想不到的结果。
以下是两个版本:
在朱莉娅:
B = Array{Float64, 2}(undef, 10000,10000)
function f(x)
return x^2
end
function g(x)
return x^3
end
function h(x)
return x^4
end
function compose(f,g,h,x)
return f(g(h(x)))
end
for i in 1:10000
for j in 1:10000
B[i,j] = compose(f,g,h,i+j)
end
end
println(sum(B))
在Python中:
import numpy as np
B = np.zeros((10000, 10000), dtype=np.float64)
def f(x):
return x**2
def g(x):
return x**3
def h(x):
return x**4
def compute(x):
return f(g(h(x)))
for i in range(10000):
for j in range(10000):
B[i, j] = compute(i+j+2)
print(np.sum(B))
编辑:Julia版本返回~8.3e22,而Python返回~1.0e109(这是我所期望的)。
虽然Julia版本与Python版本相比运行速度非常快,但它的结果并不是我所期望的。如上所述,我是第一次使用Julia,但我不知道我的错误可能在哪里。这是我的数组/数据类型处理的结果吗?我的函数没有做我所认为的事情吗?
4条答案
按热度按时间pbgvytdp1#
我不知道你是如何比较这两个代码的,但在我的机器朱莉娅只是1000倍快。
还有巨蟒:
ndh0cuux2#
我认为,通过省略
B
并使用sum的迭代器特性,甚至可以更快地实现这一点收益率
以及
其产生
以及
这看起来仍然比Python解决方案(@ AboAmmar的)快
toe950273#
我把你的代码合并成一个块,这样更容易计时。然后我对下面的代码做了一些修改,以提高性能。
1.正确数字的主要问题是整数溢出,因为
i
和j
开始时是Int64
类型。由于我们最后存储为Float64
,因此将输入强制转换为Float64
。1.通过将代码的主要内容放入函数中,我们可以利用编译。
当我执行此命令时,在速度较慢的计算机上得到以下结果:
x一个一个一个一个x一个一个二个x
请注意,您也可以在一行中执行此操作。
gjmwrych4#
Julia中的整数是64位的(不像Python,没有大小限制)你有整数溢出。
一种选择是迭代
Float64
s请注意,
$
符号是使用BenchmarkTools
宏正确测量速度所必需的,通常在代码中不会放置它们。