Julia文件输入读取速度

fro*_*ost 5 optimization performance input julia

我在解决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
Run Code Online (Sandbox Code Playgroud)

但是,与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
Run Code Online (Sandbox Code Playgroud)

情况发生变化,当我用随机数替换文件输入时(仍然比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
Run Code Online (Sandbox Code Playgroud)

有什么方法可以优化Julia中的文件读取时间(我使用的是v0.3.7)?

Iai*_*ing 8

所以我对大输入(time cat A-large-practice.in | julia original.jl)的基线时间是

real    0m2.730s
user    0m2.683s
sys     0m0.351s
Run Code Online (Sandbox Code Playgroud)

在我的系统上,Julia需要0.2秒才能开始运行文件.将代码放在函数中可能是最重要的第一步 - 这意味着一切都不是全局的,这可能会因类型推理挣扎而损害性能.这让我失望了real 2.044s.

第二个问题实际上是朱莉娅类型推理的一个缺陷,原因不同.基本上,列表推导+ map =某种类型的不稳定性.由于必须检查类型,因此传播以使算法稍后变慢.修复很简单a = Vector{Int}[map(int, split(readline())) for _ = 1:n],然后给了我real 0m0.474s.

因此大部分时间花在了朱莉娅的创业公司和map线上,并且实际印刷了Case #.如果我真的将那条map线扩展到for循环,我可以将它研磨到real 0m0.411s但是这似乎不值得.