假设我想将向量值函数phi
应用于向量x
:
phi(x, d) = [x.^i for i=0:d] # vector-valued function
x = rand(7) # vector
y = phi(x, 3) # should be matrix, but isn't
Run Code Online (Sandbox Code Playgroud)
现在y
应该是一个矩阵,但它是4-element Array{Array{Float64,1},1}
一个数组,即数组.实际上,我想y
成为一个矩阵.执行phi
错了吗?或者我该如何转换它?
谢谢!
几个月前我开始使用朱莉娅,经过数周的听证会,人们赞美它的各种功能,我决定尝试一下.我对它的了解越多,我就越喜欢它的风格,在高级语言中融合表达概念的易用性,注重速度和可用性.我实现了一个我在Julia中用C++和R编写的模型,发现Julia版本的运行速度比R版本快得多,但仍然比C++略慢.即便如此,代码在Julia中比在其他语言中更清晰.这是值得的,特别是当我推广该模型时,为扩大Julia代码范围所做的工作量远远低于其他语言中可比的工作量.
最近,我一直专注于让我的Julia代码运行得更快,因为我需要运行这个模型数万亿次.在此过程中我一直在引导@code_warntype
,@time
,@profile
和ProfileView
和track-allocation
标志.大.这个工具包不像其他语言的分析工具那么好,但它仍然指出了很多瓶颈.
我发现我在我的代码中恰好具有我喜欢的朱莉娅的高级表现力,当我重写那种表达性以避免不必要的分配时,我失去了那种表达能力.作为一个简单的例子,我最近更改了一行代码
sum([x*y for x in some_list, y in similar_list])
Run Code Online (Sandbox Code Playgroud)
循环迭代列表并添加到状态变量.不是火箭科学,我理解为什么不必分配数组更快一点.其实这是一个很大,虽然速度更快.所以我做了类似的事情,避免使用Dicts或"感觉"正确的问题的复合类型,当我可以只是手动跟踪临时并行数组中的索引,一种编码风格,我厌恶,但显然运行一个当我重复创建和简单地使用小数据结构的特定操作时,要快很多次.
一般来说,这很好,因为我已经开始注意编写简短方法的指令,因此组成我自己的较短方法的行为的高级方法不需要"担心"较短的方法如何工作; 较短的那些可能是笨重的阅读而不会使我的程序的核心笨重阅读.
但这让我想知道我是否"错过了什么".如果语言的全部要点(对我而言,作为一个非理论上的最终用户)部分地将速度与易于开发/思考/阅读/维护等结合起来,即成为可写和可用的技术计算语言,然后这并不意味着我不应该花时间考虑最快的方法来添加一堆数字,不应该重写"易于阅读"或优雅的代码,利用映射,过滤器和将高级功能概念转化为"笨重"的代码,重新发明轮子,以低级别跟踪数组索引的方式表达那些东西?(我的某些部分期望在其设计背后具有如此多智能的语言足够聪明以"弄清楚"当我写sum([x*y])时它实际上不需要分配新数组,并且我太过于愚蠢地找出正确的词语来告诉语言,除了通过字面"手动"告诉整个循环业务.有一点我甚至想过写@macros
一些快速表达的代码"转换"到长期但是更快的循环表达式,但我认为如果我基本上试图扩展编译器的函数只是为了解决相当简单的问题,我必须考虑错误的问题,这就是导致我写这个问题的原因.)
也许答案是"如果你想要真正的高性能代码,无论如何都要付出代价." 或者换句话说,快速代码与令人讨厌的读取循环,数组,跟踪索引等令人不愉快的代码是速度易读性权衡空间的有效前沿.如果是这样,这是完全有效的,因此我不会说我认为朱莉娅更少.我只是想知道这种编程风格是否真的在前沿,或者我的体验是什么,因为我只是没有用语言编写"好".(通过类比,看看问题什么是你最有效的Vim快捷方式?哪里接受的优秀答案基本上是OP没有"得到"它.)我怀疑即使我成功了让语言做我想做的很多事情,我只是不"得到"某些东西,但我不太了解要求什么,因为我担心我没有得到的是一个未知的未知对我来说.
TL; DR:在Julia的最佳实践中,我花了很多时间将我的高级函数调用"分解"为循环和数组的原始实现,以获得更快的性能,或者是指示性的我没有考虑正确编程/使用该语言?
在朱莉娅,我有一个复杂模拟的功能monte_carlo_sim()
,涉及许多参数.在这个函数里面,我需要调用很多其他函数.我可以写独立的功能之外的monte_carlo_sim()
,但后来我需要通过大量的parameters--很多都是这个function--这会牺牲的优雅和清晰度(也许用不了的事实,即这些都是内是恒定的常数变量?).是否存在不在函数中包含函数的性能原因?作为这里的玩具示例,温度T
是恒定的,如果我不想将此变量传递给我的函数compute_Boltzmann()
,我可以执行以下操作.这有什么不对吗?
function monte_carlo_sim(temp::Float64, N::Int)
const T = temp
function compute_Boltzmann(energy::Float64)
return exp(-energy/T)
end
# later call this function many times
for i = 1:1000
energy = compute_energy()
b = compute_Boltzmann(energy)
end
end
Run Code Online (Sandbox Code Playgroud)
或者,我可以定义一个新的const型SimulationParameters
,并通过这个来compute_Boltzmann
代替,并写compute_Boltzmann
在外面monte_carlo_sim
的功能在这里?这是否更好?不过,在这种情况下,我会传递的信息比我需要的更多.
我有一个类型T
,如何在REPL中获取所有专门用于此类型的方法?我的动机是T
在一个包中定义,T
从源代码中可能不容易看到我的意思.
总之,我想要类似的东西
functions(T)
Run Code Online (Sandbox Code Playgroud)
如methods
已经存在,但它需要的功能,我想了解
如何打开文本文件并逐行阅读?我对以下两种情况感兴趣:
对于第二种情况,我不想一次将所有行都保留在内存中。
我正在尝试将 python 脚本转换为 Julia。我正在检查以确保我以最佳方式执行此代码。请看以下代码:
julia> a = [1,2,3,4,5]
5-element Array{Int64,1}:
1
2
3
4
5
julia> if 1 in a
print("1 is in a")
end
1 is in a
julia> if 6 not in a
print("6 not in a")
end
ERROR: TypeError: non-boolean (Int64) used in boolean context
Stacktrace:
[1] top-level scope at REPL[6]:1
julia> push!(a, 6)
6-element Array{Int64,1}:
1
2
3
4
5
6
julia> if (6 in a) == true
print("6 in a")
end
6 not in a …
Run Code Online (Sandbox Code Playgroud) 我正在比较 Julia 和 C++ 之间的性能。然后我发现 Julia 中的快速排序要快得多(甚至比 C++ 还要快),尤其是当数组的大小非常大时。
任何人都可以解释原因吗?
快速排序文件
include("../dimension.jl")
function execute()
n = getDimension()
print(stderr, "Julia,quickSort_optim,$n,"); # use default delimiter
arr = zeros(Int32, n)
for i = 1:n
arr[i] = (777*(i-1)) % 10000
end
if n > 0
sort!(arr; alg=QuickSort)
end
end
# executing ...
execute()
Run Code Online (Sandbox Code Playgroud)
quickSort_boost.cpp
#include "dimension.h"
#include <boost/lambda/lambda.hpp>
#include <boost/sort/pdqsort/pdqsort.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
using namespace boost::sort;
int main()
{
int n = getDimension();
cerr << "C++,quickSort_boost," << n …
Run Code Online (Sandbox Code Playgroud) 我想从 github 安装以下包。我尝试在我的环境中使用以下命令来安装
(nlpEnvJl) pkg> add "https://github.com/yeesian/LeafletJS.jl/tree/master/src"
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误,
错误:在包中找不到项目文件,https://github.com/yeesian/LeafletJS.jl
可能subdir
需要指定
关于如何安装有什么想法吗?我必须先将其克隆到本地存储库吗?如果是这样我如何从本地路径安装?
干杯 提前致谢
我正在使用 Symbolics.jl,我想进行数学求和,相当于 Sympy 中的 Sum 函数(https://docs.sympy.org/latest/modules/concrete.html)
Symbolics.jl 的文档表明这是可能的:
- 离散数学(求和、乘积、二项式系数等的表示)
然而,在常见问题中,却提出了相反的建议:
允许循环,但循环迭代的数量不应要求您知道符号 x 的值。
我正在维护一个 Julia 库,其中包含一个函数,用于在长字符串中每 80 个字符后插入一个新行。
当字符串长度超过 100 万个字符时,此函数会变得非常慢(秒或更长时间)。时间似乎比线性增长更多,也许是二次增长。我不明白为什么。有人可以解释一下吗?
这是一些可重现的代码:
function chop(s; nc=80)
nr = ceil(Int64, length(s)/nc)
l(i) = 1+(nc*(i-1))
r(i) = min(nc*i, length(s))
rows = [String(s[l(i):r(i)]) for i in 1:nr]
return join(rows,'\n')
end
s = "A"^500000
chop(s)
Run Code Online (Sandbox Code Playgroud)
看来这一行是花费最多时间的地方:rows = [String(s[l(i):r(i)]) for i in 1:nr]
这是否意味着初始化一个新的需要很长时间String
?这并不能真正解释超线性运行时间。
我知道构建字符串的规范快速方法是使用IOBuffer
或更高级的StringBuilders
包: https: //github.com/davidanthoff/StringBuilders.jl
有人可以帮助我理解为什么上面的代码仍然如此缓慢吗?
奇怪的是,下面的代码要快得多,只需添加s = collect(s)
:
function chop(s; nc=80)
s = collect(s) #this line is new
nr = ceil(Int64, length(s)/nc)
l(i) = 1+(nc*(i-1))
r(i) = …
Run Code Online (Sandbox Code Playgroud) julia ×10
performance ×2
benchmarking ×1
c++ ×1
coding-style ×1
file-io ×1
quicksort ×1
string ×1