【问题标题】:Bind function arguments in Julia在 Julia 中绑定函数参数
【发布时间】:2021-10-04 23:55:16
【问题描述】:

Julia 是否在 C++ 中提供类似于 std::bind 的内容?我希望按照以下方式做一些事情:

function add(x, y)
  return x + y
end


add45 = bind(add, 4, 5)
add2 = bind(add, _1, 2)
add3 = bind(add, 3, _2)

如果这是可能的,它是否会产生任何性能开销?

【问题讨论】:

  • stackoverflow.com/questions/68536525/… 能回答您的问题吗?如果是,我会将其作为重复项关闭。
  • 您提供的bind 函数确实回答了这些问题。这是否会导致性能损失(即使使用const)?
  • 这是一个有效的问题,我可以在这里回答:)(只是不要结束你的问题)。

标签: julia function-binding


【解决方案1】:

正如here 的回答,您可以使用 Julia 中的高阶函数来获得此行为。

关于性能。不应该有开销。实际上编译器应该在这种情况下内联所有内容,甚至执行常量传播(这样代码实际上可以更快)。仅因为我们在全球范围内工作,才需要在另一个答案 here 中使用 const。如果所有这些都将在函数中使用,则不需要const(因为接受此参数的函数将被正确编译),因此在下面的示例中我不使用const

让我举一个 Base.Fix1 和你的 add 函数的例子:

julia> using BenchmarkTools

julia> function add(x, y)
         return x + y
       end
add (generic function with 1 method)

julia> add2 = Base.Fix1(add, 10)
(::Base.Fix1{typeof(add), Int64}) (generic function with 1 method)

julia> y = 1:10^6;

julia> @btime add.(10, $y);
  1.187 ms (2 allocations: 7.63 MiB)

julia> @btime $add2.($y);
  1.189 ms (2 allocations: 7.63 MiB)

请注意,我没有将add2 定义为const,因为我们在全局范围内,我需要在其前面加上$ 以将其值插入到基准测试套件中。

如果我不这样做,你会得到:

julia> @btime add2.($y);
  1.187 ms (6 allocations: 7.63 MiB)

这基本上是相同的时间和内存使用,但分配 6 次而不是 2 次,因为在这种情况下 add2 是一个类型不稳定的全局变量。

我在 DataFrames.jl 上工作,使用我们在这里讨论的模式非常有用。我只举一个例子:

julia> using DataFrames

julia> df = DataFrame(x = 1:5)
5×1 DataFrame
 Row │ x
     │ Int64
─────┼───────
   1 │     1
   2 │     2
   3 │     3
   4 │     4
   5 │     5

julia> filter(:x => <(2.5), df)
2×1 DataFrame
 Row │ x
     │ Int64
─────┼───────
   1 │     1
   2 │     2

该操作的作用是从列:x 中选择小于2.5 的行。这里要理解的关键是&lt;(2.5) 的作用。它是:

julia> <(2.5)
(::Base.Fix2{typeof(<), Float64}) (generic function with 1 method)

如您所见,它类似于我们定义x -&gt; x &lt; 2.5 函数时所获得的结果(本质上是修复&lt; 函数的第二个参数,如在Julia 中&lt; 只是一个双参数函数) .像上面的&lt;(2.5) 这样的快捷方式在 Julia 中默认定义为几个常见的比较运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2016-05-16
    • 2023-03-09
    • 2019-12-07
    • 2016-03-24
    相关资源
    最近更新 更多