Julia代码臃肿了不少,速度两者差不多.
两种语言还有下列不同:
1.字典对于不存在的键值,julia没有默认值,必须用hashkey函数判断,直接访问报错,python默认0。
2.对于整数和Bool两种类型的变量。julia不能相加,python可以加。
3.对于BigInt类型,julia必须用赋值显式声明变量类型,python可以自动判断并设置。
4.Bool类型常量,julia全小写,Python首字母大写,其余小写。
5.for循环的上下边界,julia都包含,Python的Range包含下限,不包含上限。
6.'或','否'条件运算符,julia用||,==0 ,Python用or和not
7.遍历字典时,Julia必须定义一个游标类型,Python可以直接用变量代表键值。
8.判断循环正常结束,没有中途退出。Python有一个else语法,Julia只能用标志变量。
python
from collections import defaultdict
def f(l):
d = defaultdict(int)
for i in range(1, 10):
d[1<
for i in range(l-1):
d, d2 = defaultdict(int), d
for (bm,dbm,bl), cn in d2.items():
for j in range(10):
nbm = ndbm = 0
t = bl
for k in range(l):
c = (k==0) + ((bm&(1<
if not c: continue
z = (k * 10 + j) % l
if z==0:
if t+c>1: break
t = True
if (nbm & (1<1:
ndbm |= 1<
nbm |= 1 << z
else:
d[nbm, ndbm, t] += cn
return sum(c for (bm, dbm, bl), c in d.items() if bl)
def go(N):
return sum(map(f, range(1, N+1)))
go(15)
julia
function f(l::Int)
d=Dict{Tuple{Int,Int,Bool},BigInt}()
for i in 1:10-1
a=(1<
if haskey(d, a) d[a]+=1 else d[a]=1 end
end
for i in 0:l-1-1
d, d2 = Dict{Tuple{Int,Int,Bool},BigInt}(), d
for x in d2
(bm,dbm,bl), cn = x.first,x.second
#println(bm)
for j in 0:10-1
nbm = ndbm = 0
t = bl
flag =0
for k in 0:l-1
c = (k==0) + ((bm&(1<
if c==false
continue
end
z = (k * 10 + j) % l
if z==0
if t+c>1
flag=1
break
end
t = true
end
if ((nbm & (1<1
ndbm |= 1<
end
nbm |= 1 << z
#else: k not break out
end #k
if flag==0
a=(nbm, ndbm, t)
if haskey(d, a) d[a]+=cn else d[a] = cn end
#println(d[a])
end
end #j
end #x
end #i
sumc=BigInt(0)
for x in d
(bm,dbm,bl), c1 = x.first,x.second
if bl sumc+=c1 end
end
return sumc
end
function go(N::Int)
#return sum(map(f, 1:N+1-1))
sumc=BigInt(0)
for x in 1:N+1-1
sumc+=f(x)
end
return sumc
end
go(15)
把上述julia代码中的BigInt都修改为Int128,其他不动,速度提高了20%.
julia> @time go128(19)
39.090864 seconds (245.53 M allocations: 3.208 GB, 6.47% gc time)
3079418---040719
julia> @time go(19)
51.460135 seconds (301.17 M allocations: 3.782 GB, 11.80% gc time)
3079418---040719