小编Phi*_*ell的帖子

如何消除Julia可执行文件中的JIT开销(使用MWE)

我使用PackageCompiler希望创建一个可执行文件,从而消除了即时编译开销。

该文档解释说,我必须定义一个函数julia_main来调用程序的逻辑,并编写一个“探听文件”,该脚本调用我希望预编译的函数。My julia_main接受一个参数,即包含要分析的输入数据的文件的位置。因此,为了简单起见,我的监听文件只需要julia_main使用特定的输入文件进行一次调用即可。因此,我希望看到针对相同的输入文件执行时,生成的可执行文件运行良好且运行速度快(无编译开销)。

但是a,那不是我所看到的。在新的Julia实例中julia_main,第一次执行大约需要74秒,后续执行大约需要4.5秒。每次调用可执行文件大约需要50秒。

我对build_executable函数的使用如下所示:

julia> using PackageCompiler

julia> build_executable("d:/philip/source/script/julia/jsource/SCRiPTMain.jl",
                        "testexecutable",
                        builddir = "d:/temp/builddir4",
                        snoopfile = "d:/philip/source/script/julia/jsource/snoop.jl",
                        compile = "all",
                        verbose = true)
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 以上参数是否正确实现了我的无JIT开销的可执行文件的目标?
  2. 还有其他建议吗?

这是对的响应build_executable。从Start of snoop file execution!到的行End of snoop file execution!由我的代码发出。

Julia program file:
  "d:\philip\source\script\julia\jsource\SCRiPTMain.jl"
C program file:
  "C:\Users\Philip\.julia\packages\PackageCompiler\CJQcs\examples\program.c"
Build directory:
  "d:\temp\builddir4"
Executing snoopfile: "d:\philip\source\script\julia\jsource\snoop.jl"
Start of snoop file execution!
? Warning: The 'control file' contains the key 'InterpolateCovariance' …
Run Code Online (Sandbox Code Playgroud)

julia

7
推荐指数
1
解决办法
140
查看次数

在 Julia 中是否值得对“JSON.parsefile”返回的字典进行类型缩小

我正在编写 Julia 代码,其输入是 json 文件,在(数学金融领域)中执行分析并将结果写入 json。代码是从 R 移植过来的,希望能提高性能。

我使用JSON.parsefile. 这将返回一个 Dict,其中我观察到所有向量的类型都是Array{Any,1}。碰巧的是,我知道输入文件永远不会包含混合类型的向量,例如某些Strings 和某些Numbers。因此,我编写了以下代码,它似乎运行良好并且“安全”,因为如果调用convert失败,则向量将继续具有 type Array{Any,1}

function typenarrow!(d::Dict)
    for k in keys(d)
        if d[k] isa Array{Any,1}
            d[k] = typenarrow(d[k])
        elseif d[k] isa Dict
            typenarrow!(d[k])
        end
    end
end

function typenarrow(v::Array{Any,1})
    for T in [String,Int64,Float64,Bool,Vector{Float64}]
        try
            return(convert(Vector{T},v))
        catch; end        
    end
    return(v)
end
Run Code Online (Sandbox Code Playgroud)

我的问题是:这值得吗?Dict如果我进行这种类型缩小,我是否可以期望处理内容的代码执行得更快?我认为答案是肯定的,因为Julia 性能提示建议“注释取自无类型位置的值”,这种方法可确保没有“无类型位置”。

json julia

5
推荐指数
1
解决办法
416
查看次数

Julia 中具有不规则网格的三次样条插值

我正在将一些代码从 R 移植到 Julia,并且正在努力翻译 R 的spline函数。我需要一个 Julia 函数:

function spline_j(x,y,xout)
Run Code Online (Sandbox Code Playgroud)

产生与调用 R 函数相同的回报:

spline(x,y,,"fmm",,,xout)
Run Code Online (Sandbox Code Playgroud)

即使用 Forsyth、Malcolm 和 Moler 的方法,这是 R 中的默认方法。

Myxy总是一维的,但 的点x不规则间隔。这种不规则性似乎排除了使用纯 JuliaInterpolations包的可能性,因为文档指出“目前仅LinearInterpolation支持不规则网格”。

Dierckx包支持不规则x,所以一个候选人spline_j是:

using Dierckx

function spline_j(x, y, xout)
    spl = Dierckx.Spline1D(x, y)
    spl(xout)
end
Run Code Online (Sandbox Code Playgroud)

spline如果method是,则匹配 R 的函数"natural"

是否可以"fmm"在 Julia 中复制 R 的方法?

r julia

5
推荐指数
1
解决办法
799
查看次数

如何在Julia函数中使用可选线程

我有一个函数,可以选择在其主循环中使用线程,而当参数为时usingthreads就这样做true。目前,代码如下所示:

function dosomething(usingthreads::Bool)
    n = 1000
    if usingthreads
        Threads.@threads for i = 1:n
            #20 lines of code here
        end
    else
        for i = 1:n
            #same 20 lines of code repeated here
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

比上面更讨厌的是将“ 20行”放在单独的函数中。还有另一种方法吗?

julia

5
推荐指数
1
解决办法
48
查看次数

在 Julia 中创建自定义类型

在 Julia 中,如何创建自定义类型MyOrderedDictAMyOrderedDictB以便:

\n\n
    \n
  1. 每个都具有 的所有功能OrderdDict,并且可以传递给任何接受AbstractDicts的函数
  2. \n
  3. 它们彼此不同,因此我可以利用多重调度。
  4. \n
\n\n

我怀疑\\希望这很简单,但还没有\xe2\x80\x99能够弄清楚。

\n

julia

5
推荐指数
1
解决办法
1229
查看次数

Julia Multiple Dispatch入​​门

这就是我在Julia中看到的最简单的多次调度示例 - 它是一个名为adhoc.jl的文件的整个(8行)内容.

f = function(x::String)
    println("Called first version of f")
end
f = function(x::Float64)
    println("Called second version of f")
end
f("x")
f(1.0)
Run Code Online (Sandbox Code Playgroud)

然而,当我运行那个(通过include("Adhoc.jl"))julia抱怨:

ERROR: LoadError: MethodError: no method matching 
(::getfield(Main, Symbol("##17#18")))(::String)
Run Code Online (Sandbox Code Playgroud)

截图在这里

如果我改变的第二个实例fg工作上的事情,但是这不再利用多分派.为什么我不能通过多次发送到达一垒?

julia

4
推荐指数
1
解决办法
454
查看次数

Julia函数返回数组的非唯一元素

Julia base具有unique返回仅包含数组(或任何可迭代)的唯一元素的向量的函数.我正在寻找一个nonunique函数来返回一个数组,其中包含在其输入中至少出现两次的所有元素.据我所知,朱莉娅没有这样的功能,我发现有点令人惊讶.

我的第一次尝试如下:

function nonunique(x::AbstractArray)
    uniqueindexes = indexin(unique(x),x)
    nonuniqueindexes = setdiff(1:length(x),uniqueindexes)
    unique(x[nonuniqueindexes])
end
Run Code Online (Sandbox Code Playgroud)

但是受到BogumiłKamiński 对Julia中矢量独特元素索引回答的启发,我写了第二个版本:

function nonunique(x::AbstractArray{T}) where T
    uniqueset = Set{T}()
    duplicatedset = Set{T}()
    duplicatedvector = Vector{T}()
    for i in x
        if(i in uniqueset)
            if !(i in duplicatedset)
                push!(duplicatedset, i)
                push!(duplicatedvector, i)
            end
        else
            push!(uniqueset, i)
        end
    end
    duplicatedvector
end
Run Code Online (Sandbox Code Playgroud)

在我的测试中,这个版本的速度提高了大约4倍.它具有良好的属性,返回按照每组等效元素的第二个(第一个重复)最初出现的顺序排序.我认为,in为会员办理入住手续时更快SetArray,占具有两个变量duplicatedsetduplicatedvector.

我真的有必要"推出自己的" nonunique功能,第二版可以改进吗?

julia

4
推荐指数
2
解决办法
302
查看次数

标签 统计

julia ×7

json ×1

r ×1