为什么这个Python程序比一个相同的Julia程序运行快3倍

为什么这个Python程序比一个相同的Julia程序运行快3倍,python,python-2.7,julia,collatz,Python,Python 2.7,Julia,Collatz,我想尝试一下Julia编程语言,因为我听说它应该比Python更快。我决定尝试一个动态程序,因为它处理了大量的计算(寻找最长的Collatz序列) 我用Julia编写了一个程序,然后决定尝试用Python编写一个类似的程序,看看它们的速度有多快。然而,在我的机器上,Python程序运行大约2秒钟,而Julia程序运行大约7秒钟。这让我很惊讶,因为正如我之前所说的,Julia声称比Python快,所以我想知道是不是有什么固有的脚本使得Julia-one慢了很多。我试图用同样的方法计算它们 这里是脚

我想尝试一下Julia编程语言,因为我听说它应该比Python更快。我决定尝试一个动态程序,因为它处理了大量的计算(寻找最长的Collatz序列)

我用Julia编写了一个程序,然后决定尝试用Python编写一个类似的程序,看看它们的速度有多快。然而,在我的机器上,Python程序运行大约2秒钟,而Julia程序运行大约7秒钟。这让我很惊讶,因为正如我之前所说的,Julia声称比Python快,所以我想知道是不是有什么固有的脚本使得Julia-one慢了很多。我试图用同样的方法计算它们

这里是脚本,我将感谢任何见解

朱莉娅:

全局最大值=0
全局最大项=0
全局d=Dict{Integer,Integer}()
函数集合长度(n)
#println(n)
全局最大值
全局最大值项
全球d
如果haskey(d,n)
返回d[n]
结束
如果n==1
答案=1
elseif n%2==1
答案=1+coll_长度(3n+1)
其他的
答案=1+coll_长度(n/2)
结束
d[n]=答案

如果max_val“我很清楚这不是两种语言中最有效的解决方案”,那么就不值得讨论了。如果您想知道哪种语言更快,您需要用这两种语言实现最快的解决方案,然后进行比较。比较一些次优的实现和其他一些次优的实现并不能证明什么。这些程序甚至给出了相同的答案吗?如果Python函数返回
answer
,而Julia函数返回一个神秘的
x
,它在代码中不存在。我觉得这个问题很好:这是Python和Julia中两个基本相同的算法的比较。答案是,如果您想让Julia代码更快,就不应该使用可变全局变量–这是我们的第一个性能提示:@如果你想对你的代码进行更友好的讨论,你可以试着向julia发帖-users@googlegroups.com.There在Julia代码中似乎有几个问题:(1)n/2可能应该是div(n,2)以获得整数除法;(2) Dict{Int,Int}可能比Dict{Integer,Integer}更好;(3) 将
const
附加到全局范围内的
d
声明中。经过这些修改,我的计算机上的时间从4.3秒更改为0.5秒。鉴于评论中有几个问题的答案,也许可以重新打开?
global max_val = 0
global max_item = 0
global d = Dict{Integer,Integer}()
function coll_length(n)
    #println(n)
    global max_val
    global max_item
    global d
    if haskey(d,n)
        return d[n]
    end
    if n==1
        answer = 1
    elseif n%2==1
        answer = 1+coll_length(3n+1)
    else
        answer = 1+coll_length(n/2)
    end

    d[n]=answer
    if max_val<answer
        max_val=answer
        max_item=n
    end
    return answer
end


for i = 1:1000000
    coll_length(i)
end
println(max_item)
d = {}
max_val = 0
max_item = 0

def coll_length(n):
    global d 
    global max_val 
    global max_item 

    if n in d:
        return d[n]
    if n==1:
        answer= 1
    elif n%2==0:
        answer= 1+coll_length(n/2)
    else:
        answer= 1+coll_length(3*n+1)

    d[n]=answer
    if max_val<answer:
        max_val=answer
        max_item=n
    return answer

for n in range(1,1000000+1):
    coll_length(n)
print max_item