performance - Julia 文件输入读取速度

标签 performance optimization input julia

我在解决 Code Jam 问题的同时让 Julia 试一试,在这种情况下,Rope Intranet 来自 2010 年第 1C 轮(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)?

最佳答案

所以我在大输入( 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但这似乎不值得。

关于performance - Julia 文件输入读取速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30141968/

相关文章:

performance - DDD 和 Entity Framework 、过滤器

performance - 为什么这个 Clojure 微基准测试这么慢?

python - 将输入整数与列表进行比较

c# - WPF 绑定(bind)路径是否已在后台规范化?

python - 为什么将列表转换为集合比仅使用列表来计算列表差异更快?

php - 有没有办法通过一次比较来检查一个值是等于 0 还是 1?

mysql - 查询性能优化

c++ - 简化/优化逻辑的工具?

python - 如何将输入读取为数字?

javascript - 如果输入字段已填充,则删除父类