我使用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)
问题:
这是对的响应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 代码,其输入是 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 性能提示建议“注释取自无类型位置的值”,这种方法可确保没有“无类型位置”。
我正在将一些代码从 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 中的默认方法。
Myx和y总是一维的,但 的点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 的方法?
我有一个函数,可以选择在其主循环中使用线程,而当参数为时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 中,如何创建自定义类型MyOrderedDictA,MyOrderedDictB以便:
OrderdDict,并且可以传递给任何接受AbstractDicts的函数我怀疑\\希望这很简单,但还没有\xe2\x80\x99能够弄清楚。
\n这就是我在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)
截图在这里
如果我改变的第二个实例f来g工作上的事情,但是这不再利用多分派.为什么我不能通过多次发送到达一垒?
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为会员办理入住手续时更快Set比Array,占具有两个变量duplicatedset和duplicatedvector.
我真的有必要"推出自己的" nonunique功能,第二版可以改进吗?