tuples - 在 Julia 中,从前面还是后面增长 Tuple 更高效?
问题描述
如果我有一个构建元组的递归函数,在每个函数中,它通过向元组附加/附加一个元素来创建一个新元组,将它向前增长还是向后增长更好?有关系吗?即使它们最终执行相同的操作,它们中的一个在编译器上是否更容易?
以这个愚蠢的函数为例,想象一下我不在乎数字是升序还是降序(因为我总是可以调整调用代码以使其工作):
julia> function tuple_one_through_n(n, t=())::Tuple
if n === 0
t
else
tuple_one_through_n(n-1, (n, t...))
end
end
tuple_one_through_n (generic function with 2 methods)
julia> tuple_one_through_n(5)
(1, 2, 3, 4, 5)
有什么理由更喜欢t
在之前n
或之后喷溅吗?谢谢!
编辑:有关更多上下文:我们正在附加这样的元组,因为我们实际上将其用作不可变函数跟踪,并且通过附加创建一个新元组是线程安全的,因此即使我们产生新任务它也可以工作:每个任务都会然后得到它自己的堆栈跟踪,跟踪所有调用者。
我认为更好的选择可能是PersistentVector
来自https://github.com/JuliaCollections/FunctionalCollections.jl/blob/master/README.md的不可变对象,但对于最简单的第一次通过,我只是使用元组,我是想知道是否有任何理由偏爱一个订单或另一个订单。:) 因为有些人可能有一个增长元组的有效用例,我想我会问。
解决方案
这将影响动态调度并且速度非常慢,以至于问题的答案无关紧要。如果整个事情展开,那么它显然也没有关系,因为将生成相同的表达式。
在这里使用元组似乎是错误的(一般来说,将其增加到长度 n 将是 O(n^2))
推荐阅读
- arrays - 我在消息框中显示我的数组的输出时遇到问题
- sql - 与表格列表相比,MS Access 从长文本字段中提取多个匹配的文本字符串
- gpu - 如何在 GPU 上获取包含数据的卤化物缓冲区?
- angular - firebase.auth.Auth.signInWithCredential 已弃用。请改用 firebase.auth.Auth.signInAndRetrieveDataWithCredential
- java - 通过套接字发送numpy数组并在java中检索它
- laravel - laravel 路由参数在 unittest 上返回 null
- c# - Visual Studio 2017 为我的多平台 xamarin 应用报告此错误
- mysql - AWS 上的 MYSQL 或 PostgresSQL
- c - 如何使用位移/屏蔽将二进制转换为十六进制
- javascript - KeyDown 事件不能使用已编辑的状态值