python - 优化 julia one-liner 使其与 python 一样快

标签 python julia

我在 julia 中写了一个简单的单行代码来解决一个小数学问题:找到一个两位数 A 和一个三位数 B,使得它们的乘积 A x B 是一个五位数,并且每个数字来自0 到 9 在数字 A、B 和 A x B 中只出现一次。例如,

54 x 297 = 16,038

这是我的 julia 代码,它找到了所有可能的解决方案:

println(filter(l -> length(unique(reduce(vcat, (map(digits, l))))) == 10, [[x, y, x*y] for x in Range(10:99), y in Range(100:999)]))

它解决了问题,但后来我在 python 中尝试并想出了这个:

print filter(lambda y: len(set(''.join([str(x) for x in y])))==10, [[x, y, x*y] for x in range(10, 99) for y in range(100, 999)])

对它们进行计时,我惊讶地发现 python 代码的运行速度是 julia 代码的两倍多。对于 julia 代码的更快方法有什么建议(最好将其保持在一行中)?

另外:我知道我可以通过将范围快速调整到 range(12, 98) 范围(102、987)

更新

超越单行代码,我采纳了循环比列表更快的建议,因此我比较了以下替代方案:

Julia

ans = Array{Tuple{Int32, Int32, Int32}}(0)
for x in 12:98 
  for y in 102:987
    if length(unique(digits(x+y*100+x*y*100_000)))==10 push!(ans, (x, y, x*y) end
  end
end
println(ans)

python

ans = []
for x in range(12,98): 
  for y in range(102,987):
    if len(set(str(x+y*100+x*y*100000)))==10:
      ans.append((x, y, x*y))
print ans

python 代码运行得更快(即使我更改了两者的代码以简单地在循环中打印出结果而不是将它们收集在列表中)。我期待 julia 有更好的表现。

此外,如果您有兴趣,完整的解决方案列表是

39 x 402 = 15,678
27 x 594 = 16,038
54 x 297 = 16,038
36 x 495 = 17,820
45 x 396 = 17,820
52 x 367 = 19,084
78 x 345 = 26,910
46 x 715 = 32,890
63 x 927 = 58,401

最佳答案

@simd for x in 10:99 for y in 100:999 length(unique(digits(x+y*100+x*y*100_000)))==10 && println(x,'* ',y,'=',x*y) 结束结束

在我的电脑中,这段代码的速度大约是原始代码的 3 倍。 (0.223902 秒对 0.680781 秒)

关键是"avoid unnecessary arrays" .尽可能使用 for 循环或元组

关于python - 优化 julia one-liner 使其与 python 一样快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36694459/

相关文章:

python - 无法从 requirement.txt 中找到满足要求 ' ' 的版本。找不到包的匹配分布

python - MySQL:如何确保始终选择唯一记录

jupyter-notebook - 如何使用 Julia 抑制 Jupyter Notebook 中单元格的输出

gtk - 使 GTK 输入框更小

julia - Julia 中的探索性 PCA

python - 如何使用不同版本的 Python 运行 Python Nose 测试

python - 在云函数中获取环境变量

python - 制作一个可停止的简单秒表

arrays - 将数组从 Julia 发送到 Rust(使用 "ccall")

julia - 在 Julia 中解耦 tspan 和初始时间 t0