首页 > 解决方案 > 在 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的不可变对象,但对于最简单的第一次通过,我只是使用元组,我是想知道是否有任何理由偏爱一个订单或另一个订单。:) 因为有些人可能有一个增长元组的有效用例,我想我会问。

标签: tuplesjulia

解决方案


这将影响动态调度并且速度非常慢,以至于问题的答案无关紧要。如果整个事情展开,那么它显然也没有关系,因为将生成相同的表达式。

在这里使用元组似乎是错误的(一般来说,将其增加到长度 n 将是 O(n^2))


推荐阅读