我是Julia Lang的新手.我来自Matlab的背景.
在Matlab中,当按下whos命令时我将获得当前范围内的所有变量; 而且,我可以将它们存储在另一个变量中x=whos;,例如Julia中是否存在这样的命令?Matlab中的示例代码:
>> a=3;
>> b=4;
>> whos
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
b 1x1 8 double
prefix 1x16 16 char
Total is 18 elements using 32 bytes.
Run Code Online (Sandbox Code Playgroud) 在这篇文章之后,我决定将Julia与GNU Octave进行比较,结果与julialang.org中的加速结果不一致.
我编译了Julia和GNU Octave CXXFLAGS='-std=c++11 -O3',结果我得到了:
a=0.9999;
tic;y=a.^(1:10000);toc
Elapsed time is 0.000159025 seconds.
tic;y=a.^(1:10000);toc
Elapsed time is 0.000162125 seconds.
tic;y=a.^(1:10000);toc
Elapsed time is 0.000159979 seconds.
Run Code Online (Sandbox Code Playgroud)
-
tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000280142 seconds.
tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000280142 seconds.
tic;y=cumprod(ones(1,10000)*a);toc
Elapsed time is 0.000277996 seconds.
Run Code Online (Sandbox Code Playgroud)
tic();y=a.^(1:10000);toc()
elapsed time: 0.003486508 seconds
tic();y=a.^(1:10000);toc()
elapsed time: 0.003909662 seconds
tic();y=a.^(1:10000);toc()
elapsed time: 0.003465313 seconds
Run Code Online (Sandbox Code Playgroud)
-
tic();y=cumprod(ones(1,10000)*a);toc()
elapsed time: 0.001692931 seconds
tic();y=cumprod(ones(1,10000)*a);toc()
elapsed time: 0.001690245 seconds
tic();y=cumprod(ones(1,10000)*a);toc()
elapsed …Run Code Online (Sandbox Code Playgroud) 从文档中它说firstindex()找到集合的第一个索引。为什么不只使用 1?当它不是 1 时会出现什么情况?
给定一个矩阵m = [10i+j for i=1:3, j=1:4],我可以通过切割矩阵迭代它的行:
for i=1:size(m,1)
print(m[i,:])
end
Run Code Online (Sandbox Code Playgroud)
这是唯一的可能吗?这是推荐的方式吗?
那么理解呢?切片是否只能迭代矩阵的行?
[ sum(m[i,:]) for i=1:size(m,1) ]
Run Code Online (Sandbox Code Playgroud) 我和Julia一起在朱诺工作.
我不知道朱莉娅是否支持OOP.
例如,是否有类似class或structC++的?
如何使用数据或函数等成员声明它?
我想知道为什么对Float64值进行操作比对 进行操作更快Float16:
julia> rnd64 = rand(Float64, 1000);\n\njulia> rnd16 = rand(Float16, 1000);\n\njulia> @benchmark rnd64.^2\nBenchmarkTools.Trial: 10000 samples with 10 evaluations.\n Range (min \xe2\x80\xa6 max): 1.800 \xce\xbcs \xe2\x80\xa6 662.140 \xce\xbcs \xe2\x94\x8a GC (min \xe2\x80\xa6 max): 0.00% \xe2\x80\xa6 99.37%\n Time (median): 2.180 \xce\xbcs \xe2\x94\x8a GC (median): 0.00%\n Time (mean \xc2\xb1 \xcf\x83): 3.457 \xce\xbcs \xc2\xb1 13.176 \xce\xbcs \xe2\x94\x8a GC (mean \xc2\xb1 \xcf\x83): 12.34% \xc2\xb1 3.89%\n\n \xe2\x96\x81\xe2\x96\x88\xe2\x96\x88\xe2\x96\x84\xe2\x96\x82\xe2\x96\x82\xe2\x96\x86\xe2\x96\x86\xe2\x96\x84\xe2\x96\x82\xe2\x96\x81 \xe2\x96\x82\xe2\x96\x86\xe2\x96\x84\xe2\x96\x81 \xe2\x96\x82\xe2\x96\x82\xe2\x96\x82\xe2\x96\x81 \xe2\x96\x82\n \xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x87\xe2\x96\x87\xe2\x96\x86\xe2\x96\x86\xe2\x96\x87\xe2\x96\x86\xe2\x96\x85\xe2\x96\x87\xe2\x96\x88\xe2\x96\x88\xe2\x96\x86\xe2\x96\x86\xe2\x96\x85\xe2\x96\x85\xe2\x96\x86\xe2\x96\x84\xe2\x96\x84\xe2\x96\x81\xe2\x96\x81\xe2\x96\x83\xe2\x96\x83\xe2\x96\x81\xe2\x96\x81\xe2\x96\x84\xe2\x96\x81\xe2\x96\x83\xe2\x96\x84\xe2\x96\x81\xe2\x96\x83\xe2\x96\x81\xe2\x96\x84\xe2\x96\x83\xe2\x96\x81\xe2\x96\x81\xe2\x96\x86\xe2\x96\x87\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x87 \xe2\x96\x88\n 1.8 \xce\xbcs Histogram: log(frequency) by time 10.6 \xce\xbcs <\n\n …Run Code Online (Sandbox Code Playgroud) 问题1 - 升级
我v"0.3.8"在Windows上使用.我找到了
http://julialang.org/downloads/
Current Release (v0.3.9)
Run Code Online (Sandbox Code Playgroud)
我知道我可以下载prebuild版本并重新安装.有没有办法升级(从当前安装的版本)到新版本?
有Pkg.update(),它运行很长一段时间没有任何输出 - 它不能以这种方式工作.
从文档:
update()更新包元数据仓库 - 保存在Pkg.dir("METADATA")中 - 然后更新任何可以安全地从其来源拉出的固定包; 然后调用Pkg.resolve()来确定一组新的最佳软件包版本.
因此,它不是升级语言本身的正确工具.
问题2 - 发行说明
是否有ReleaseNote或ChangeList这样的东西?或者重大改变的任何亮点?
(我知道语言还没有达到v1.0.如果有一个地方可以找到重大改变/改进,那就很好.如果没有,那很好.)
我是朱莉娅的新手,鉴于我的Matlab起源,我在确定如何编写利用多个调度和Julia的类型系统的"好"Julia代码时遇到了一些困难.
考虑我有一个提供a的平方的函数的情况Float64.我可以这样写:
function mysquare(x::Float64)
return(x^2);
end
Run Code Online (Sandbox Code Playgroud)
有时,我想Float64在一维数组中对所有s 进行平方,但不想mysquare每次都写出一个循环,所以我使用多次调度并添加以下内容:
function mysquare(x::Array{Float64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Run Code Online (Sandbox Code Playgroud)
但是现在我有时正在使用Int64,所以我写了两个利用多个调度的函数:
function mysquare(x::Int64)
return(x^2);
end
function mysquare(x::Array{Int64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?或者是否有更具思想性的方法来应对这种情况?我应该使用这样的类型参数吗?
function mysquare{T<:Number}(x::T)
return(x^2);
end
function mysquare{T<:Number}(x::Array{T, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
Run Code Online (Sandbox Code Playgroud)
这感觉很合理,但我的代码运行速度会与避免参数类型的情况一样快吗?
总之,我的问题分为两部分:
如果快速代码对我很重要,我应该如上所述使用参数类型,还是应该为不同的具体类型写出多个版本?或者我应该完全做其他事情? …
Lisp中的同质性很容易看出:
(+ 1 2)
既是函数调用+与1,2作为参数,以及作为含有一个列表+,1和2.它同时是代码和数据.
但是,像朱莉娅这样的语言:
1 + 2
我知道我们可以Expr在Julia中将其解析为:
:(1 + 2)
然后我们可以获得AST并操纵它:
julia> Meta.show_sexpr(:(1+2))
(:call, :+, 1, 2)
因此,我们可以在Julia(和Elixir)中操纵程序的AST.但它们是否与Lisp一样具有同音性 - 任何代码片段实际上只是语言本身的数据结构吗?
我不知道1 + 2Julia中的代码是如何立即像(+ 1 2)Lisp中的数据一样只是一个列表.它仍然是杀人的吗?
我调整了一个简单的程序来计算和绘制Julia的运动漩涡以测试语言,我也用Python编写它没有特别的原因.
(免责声明:1.我读过的stackoverflow的每一次性能比较都因为没有全面/正确/写得好/相关等等而受到抨击 - 我不是假装这是一个真正的比较,我只想知道如何制作朱莉娅更快.2.我知道python可以优化,在Cython等中实现,这不是讨论的一部分,它只是在这里为Julia和Python中的等效函数的参考.)
代码和性能结果可以在一个要点中看到.
Julia的表现明显慢于Fortran.执行计算所花费的时间是(50000个时间步长):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Run Code Online (Sandbox Code Playgroud)
朱莉娅比Fortran慢得多(慢44倍),差距缩小但仍然显着,时间步长增加10倍(0.50s vs 15.24s).
这些结果与julia主页上显示的结果有很大不同.我究竟做错了什么?我可以修快朱莉娅吗?
我在Julia主页上浏览了Julia Performance Tips页面和比较背后的代码,没有什么能让我解决.
同样有趣的是,Julia加载PyPlot(5secsish !!)非常慢,而且比Python读取文本文件要慢得多.我可以做些什么来改善这些事情吗?
请注意,上面的时间不显示Julia和Python的加载时间,它只是计算AFAIK所需的原始时间 - 请参阅代码.对于fortran来说,这就是整个事情.在每种情况下,绘图都已大致关闭以允许速度比较.
计算机:Intel i7-3770,16GB RAM,SSD HD,操作系统:Ubuntu 13.10 64bit.,Fortran:gfortran,GNU Fortran(Ubuntu/Linaro 4.8.1-10ubuntu9)4.8.1,Julia:版本0.3.0-prerelease + 396 (2013-12-12 00:18 UTC),提交c5364db*(0天大师),x86_64-linux-gnu,Python:2.7.5+
根据ivarne的建议,我重新编写了Julia脚本(在上面的gist中更新):在函数中封装grunt工作,声明所有内容的类型,并在适用的情况下将矩阵的不同元素拆分为不同的数组.(我在很多地方都包含了Float64,因为我尝试了Float32,看看是否有帮助,但大部分时间都没有).
结果如下:
50,000 时间步骤:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
Run Code Online (Sandbox Code Playgroud)
500,000 时间步骤:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, …Run Code Online (Sandbox Code Playgroud)