Performance 我用朱莉娅对吗?

Performance 我用朱莉娅对吗?,performance,coding-style,julia,Performance,Coding Style,Julia,几个月前,我开始使用Julia,在听了几个星期人们对它的各种功能的赞扬之后,我决定尝试一下。我对它了解得越多,我就越喜欢它的风格,它融合了用高级语言表达概念的便利性和对速度和可用性的关注。我实现了一个模型,我也写在C++和R在朱丽亚,发现朱丽亚版本跑得比R版本快,但仍然略慢于C++。即使如此,朱莉娅的代码比其他两种语言的代码更清晰。这是很有价值的,特别是当我概括了这个模型时,扩展Julia代码范围所需的工作量远远小于其他语言中的可比工作量 最近,我一直专注于让我的Julia代码运行得更快,因为我

几个月前,我开始使用Julia,在听了几个星期人们对它的各种功能的赞扬之后,我决定尝试一下。我对它了解得越多,我就越喜欢它的风格,它融合了用高级语言表达概念的便利性和对速度和可用性的关注。我实现了一个模型,我也写在C++和R在朱丽亚,发现朱丽亚版本跑得比R版本快,但仍然略慢于C++。即使如此,朱莉娅的代码比其他两种语言的代码更清晰。这是很有价值的,特别是当我概括了这个模型时,扩展Julia代码范围所需的工作量远远小于其他语言中的可比工作量

最近,我一直专注于让我的Julia代码运行得更快,因为我需要将这个模型运行数万亿次。在这样做的过程中,我一直遵循
@code\u warntype
@time
@profile
ProfileView
以及
轨道分配
标志。伟大的这个工具包不如其他一些语言的评测工具好,但它仍然指出了许多瓶颈

我发现,我的代码中有我喜欢的Julia中的高级表达能力,当我重写该表达能力以避免不必要的分配时,我就失去了这种表达能力。作为一个简单的例子,我最近更改了一行

sum([x*y for x in some_list, y in similar_list])
循环,循环遍历列表并添加到状态变量。不是火箭科学,我明白为什么不用分配阵列会快一点。事实上,速度要快得多。因此,我也做了类似的事情,避免使用dict或“感觉”适合这个问题的复合类型,当我可以手动跟踪临时并行数组中的索引时,一种我讨厌的编码方式,但当我多次重复创建和简单使用小型数据结构的特定操作时,它显然会运行得更快

总的来说,这在很大程度上是好的,因为我已经把编写短方法的说明放在心上,所以组成我自己的短方法行为的高级方法不需要“担心”短方法如何工作;较短的程序阅读起来可能很笨拙,而不会使我的程序核心阅读起来很笨拙

但这让我想知道我是否“遗漏了什么”。如果语言的全部要点(对于我这个不关心理论的最终用户来说)部分是将速度与易于开发/思考/阅读/维护等结合起来,即成为一种可写且可用的技术计算语言,那么,这难道不意味着我不应该花时间去思考最快的方法来累加一堆数字,不应该重写“易于阅读”或优雅的代码,利用映射、过滤器和高级函数概念来“笨拙”吗重新发明轮子的代码,以低级别跟踪数组索引的方式表达这些内容?(我有一部分人认为,一种在其设计背后拥有如此多智能的语言足够聪明,可以“弄明白”,当我写sum([x*y])时,它实际上不需要分配一个新数组,而且我太迟钝了,无法找出正确的词来告诉语言,除非通过字面上的“告诉它”整个循环业务都是手工完成的。有一次我甚至考虑过写
@macros
来“转换”一些快速表达的代码变成了长而快的循环表达式,但我想如果我只是为了解决相当简单的问题而扩展编译器的函数,那么我一定是在错误地思考这个问题,这就是我写这个问题的原因。)

也许答案是“如果你真的想要高性能的代码,不管发生什么,你都要付出代价。”或者换言之,具有令人讨厌的循环、数组、索引跟踪等的快速代码是速度易读性权衡空间的有效前沿。如果是这样的话,那是完全正确的,因此我不会说我对朱莉娅的看法不那么好。我只是想知道这种编程风格是否真的处于前沿,或者我的经验是否就是这样,因为我用这种语言编程“不好”。(打个比方,看看这个问题,公认的优秀答案基本上是OP没有“得到”它。)我怀疑,即使我成功地让语言实现了我想要的,我也没有“得到”什么,但是我不知道该要求什么,因为我担心我得不到的东西对我来说是未知的


TL;DR:Julia的最佳实践是我花费大量时间将高级函数调用“分解”为循环和数组的原始实现,以获得更快的性能,或者这表明我没有正确考虑使用该语言编程?

我认为这个话题与Julia用户组已经在进行的讨论非常一致,我想在这里引用讨论中的一段:

@斯特凡·卡尔平斯基:

每种语言都有不同的代码编写风格和级别 语言。有高度抽象的C++,还有低级的 跟踪C++的指针,基本上是C。 void*-有效地动态类型化的编程风格 没有安全。鉴于这一事实,我不确定如何解决这两个问题 从这篇文章的角度来看,语言问题是这样的 摆姿势。只执行一种编程风格听起来像是个问题 对我来说,这不是一个解决办法。相反,我认为朱莉娅的 最大的优势在于它能够适应非常广泛的 编程风格和级别

我自己在朱丽亚编程方面的经验表明,它可以填补一个现代的空白箱。