performance - 如何在不牺牲性能的情况下将函数作为参数传递给Julia中的其他函数?

标签 performance function functional-programming julia anonymous-function

编辑,以尝试解决@ user2864740的编辑和评论:我想知道是否有任何与0.4rc1/rc2特别相关的信息,或者特别是来自Julia开发人员的策略或建议,而不是下面引用的最新信息(尤其是@ StefanKarpinski在2014年1月的第6条答案)。谢谢

请参阅

  • https://groups.google.com/forum/#!topic/julia-users/pCuDx6jNJzU
  • https://groups.google.com/forum/#!topic/julia-users/2kLNdQTGZcA
  • https://groups.google.com/forum/#!msg/julia-dev/JEiH96ofclY/_amm9Cah6YAJ
  • https://github.com/JuliaLang/julia/pull/10269
  • https://github.com/JuliaLang/julia/issues/1090
  • Can I add type information to arguments that are functions in Julia?
  • 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注释每个输入函数,那么您将尽一切可能而无需调整为您要传递的具体参数的具体情况。”

    如果是这样,那太好了-我只是想知道这是否是正确的解释,或者,是否有我可以阅读的关于该主题的一些资源比此处的链接集合更接近“逻辑上”呈现的综合信息(这更多是关于这个问题的集体意识或思想史)。

    最佳答案

    答案仍然是“使用FastAnonymous.jl”,或手动创建“functor类型”(请参阅​​NumericFuns.jl)。

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

    关于performance - 如何在不牺牲性能的情况下将函数作为参数传递给Julia中的其他函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726342/

    相关文章:

    typescript - 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续

    clojure - 函数式编程中的数学函数

    c# - 为什么具有可为空值的结构的 HashSet 非常慢?

    python - 简单的函数调用在 Robot Framework 中不起作用

    c - 在我的函数数组中没有获得正确的计数器

    PHP 函数运行时间?

    f# - 如何从函数中删除命令式代码?

    json - Postgres json 索引对查询速度没有影响

    javascript - V8 中 Javascript 方法的时间复杂度

    java - java中的速率控制