【问题标题】:How to pass functions as arguments to other functions in Julia without sacrificing performance?如何在不牺牲性能的情况下将函数作为参数传递给 Julia 中的其他函数?
【发布时间】:2015-12-19 23:45:52
【问题描述】:

EDIT 尝试解决 @user2864740 的编辑和评论:我想知道是否有任何与 0.4rc1/rc2 特别相关的信息,或者特别是来自 Julia 开发人员之一的策略或建议最近比下面引用的那些(特别是@StefanKarpinski 在下面#6 中的 2014 年 1 月回答)。谢谢

请参见例如

  1. https://groups.google.com/forum/#!topic/julia-users/pCuDx6jNJzU
  2. https://groups.google.com/forum/#!topic/julia-users/2kLNdQTGZcA
  3. https://groups.google.com/forum/#!msg/julia-dev/JEiH96ofclY/_amm9Cah6YAJ
  4. https://github.com/JuliaLang/julia/pull/10269
  5. https://github.com/JuliaLang/julia/issues/1090
  6. Can I add type information to arguments that are functions in Julia?
  7. Performance penalty using anonymous function in Julia

(作为一个相当缺乏经验的 Julia 用户)我对这些信息的最佳综合(其中一些似乎已经过时)是,最佳实践是“避免这样做”或“使用 FastAnonymous.jl”。

我想知道处理这个问题的最新和最好的方法是什么。

[加长版:]

特别是,假设我有很大的功能层次结构。我希望能够做类似的事情

function transform(function_one::Function{from A to B},
                   function_two::Function{from B to C},
                   function_three::Function{from A to D})
    function::Function{from Set{A} to Dict{C,D}}(set_of_As::Set{A})
        Dict{C,D}([function_two(function_one(a)) => function_three(a)
                   for a in set_of_As])
    end
end

请不要太按字面意思理解代码。这是一个更一般的转换形式的一个狭窄示例,无论转换的实际细节如何,我都希望能够做到,但我想以一种我不必担心的方式来做(太多)关于检查性能(也就是说,超出了我在任何非函数作为参数的情况下应用的正常担忧)每次我编写一个以这种方式运行的函数时。

例如,在我的理想世界中,正确的答案是“只要你在使用这些函数作为参数调用这个函数之前用 @anon 注释每个输入函数,那么你会做得很好你可以不调整你传递的具体参数的具体情况。”

如果这是真的,那太好了——我只是想知道这是否是正确的解释,或者如果不是,我是否可以阅读关于这个主题的一些资源,它更接近于“逻辑”呈现的综合而不是集合链接在这里(更多的是集体意识流或关于这个问题的思想史)。

【问题讨论】:

  • 标题是特定时间的。如果有更新的更改(可能在之前的一些问题/答案中遗漏了)并且此类改进与此问题相关,请确保它们与正文相得益彰。
  • 另一个链接给你here,虽然你不需要另一个链接:-)

标签: performance function functional-programming julia anonymous-function


【解决方案1】:

答案仍然是“使用 FastAnonymous.jl”,或者手动创建“函子类型”(参见 NumericFuns.jl)。

如果您使用的是 julia 0.4,FastAnonymous.jl 的工作方式与官方的“快速关闭”最终在基础 julia 中的工作方式基本相同。见https://github.com/JuliaLang/julia/issues/11452#issuecomment-125854499。 (FastAnonymous 在 julia 0.3 上以非常不同的方式实现,并且有很多弱点。)

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2022-01-10
    • 2019-07-13
    相关资源
    最近更新 更多