朱莉娅文件输入读取速度

5

我在解决Code Jam问题时尝试使用Julia语言,这里是来自2010年1C轮的Rope Intranet问题(https://code.google.com/codejam/contest/619102/dashboard

解决方案基本上如下:

for tc = 1:int(readline())
    n = int(readline())
    a = [map(int, split(readline())) for _ = 1:n]
    ans = 0

    for (i, x) in enumerate(a)
        for y in a[i + 1:end]
            ans += (x[1] - y[1]) * (x[2] - y[2]) < 0
        end
    end

    println("Case #", tc, ": ", ans)
end

然而,与C++和Python的解决方案相比,大输入的时间结果并不令人印象深刻:

julia
real    0m6.196s
user    0m6.028s
sys     0m0.373s

c++
real    0m0.392s
user    0m0.338s
sys     0m0.053s


pypy
real    0m0.529s
user    0m0.507s
sys     0m0.016s

当我用随机数替换文件输入时,情况发生了变化(尽管仍然比C ++慢):

julia
real    0m3.065s
user    0m2.868s
sys     0m0.338s

c++
real    0m1.413s
user    0m1.348s
sys     0m0.055s

pypy
real    0m22.491s
user    0m22.257s
sys     0m0.160s

有没有办法在Julia中优化文件读取时间(我使用的是v0.3.7版本)?
1个回答

9

所以在大输入上,我的基准时间是 (time cat A-large-practice.in | julia original.jl):

real    0m2.730s
user    0m2.683s
sys     0m0.351s

在我的系统上,Julia启动运行文件大约需要0.2秒。将代码放入函数可能是最重要的第一步 - 这意味着不是所有内容都是全局的,这可能会影响性能,因为类型推断会受到影响。这使我降低到了real 2.044s
第二个问题实际上是Julia类型推断的一个缺陷,原因是列表推导式+map =某些类型不稳定。这会传播到后面的算术运算中,使其变慢,因为它必须检查类型。修复方法很简单,即a = Vector{Int}[map(int, split(readline())) for _ = 1:n],然后给我real 0m0.474s
因此,大部分时间都花费在Julia启动、map行和实际打印Case #上。如果我真的将那个map行扩展到for循环中,我可以将其缩短到real 0m0.411s,但这似乎不值得。

谢谢,这让我达到了real 0m1.116s。但是在我的机器上,我没有看到将代码放入函数中带来的任何收益。 - frost
另外,也许你会发现这个有用,time cat A-large-practice.in | julia A.jltime julia A.jl <A-large-practice.in 慢了约0.15毫秒。而且后者打起来更快。 - frost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接