编写一个将 AbstractVector 作为其参数的函数

薄荷热巧克力

性能提示

在使用参数化类型(包括数组)时,最好尽可能避免使用抽象类型进行参数化。

假设您正在编写一个需要 a 的函数Vector,并且每次使用该函数时,Vector都可以包含不同的类型。

function selection_sort!(unsorted_vect::AbstractVector)
    # Code to sort.
end 

names = String["Sarah","Kathy","Amber"]
unsorted_fibonacci = Int32[8, 1, 34, 21, 3, 5, 0, 13, 2, 1]
    
selection_sort!(names)
selection_sort!(unsorted_fibonacci)

第一次使用selection_sort!()时,Vector包含String,第二次使用Int32

该函数知道它正在获取一个AbstractVector,但它不知道元素的类型。

  1. 性能会低效吗?会和写作一样selection_sort!(unsorted_vect::AbstractVector{Real})吗?

同一部分还说:

如果您无法避免使用抽象值类型的容器,有时最好使用 Any 进行参数化以避免运行时类型检查例如 IdDict{Any, Any} 比 IdDict{Type, Vector} 表现更好

  1. 以这种方式编写函数会更好吗?
function selection_sort!(unsorted_vect::AbstractVector{Any})

如果是这样,为什么排序算法只使用AbstractVector

function sort!(v::AbstractVector, # left out other parameters)
普热梅斯瓦夫·舒费尔

你需要的是:

function selection_sort!(unsorted_vect::AbstractVector{T}) where T
    # Code to sort.
end 

这样,您就有了容器的抽象类型(因此任何容器都将被接受)。然而,这些容器并不是抽象的——因为它们的元素可以有一个具体的类型—— T

但是,这只是对参数类型的限制。Julia 会很高兴,function selection_sort!(unsorted_vect)并且代码也会一样高效。

真正重要的是论点的类型。考虑以下 3 个变量:

a = Vector{Float64}(rand(10))
b = Vector{Union{Float64,Int}}(rand(10))
c = Vector{Any}(rand(10))

a是类型化容器,b是小联合类型容器,c是抽象容器。让我们看看性能发生了什么:

julia> @btime minimum($a);
  18.530 ns (0 allocations: 0 bytes)

julia> @btime minimum($b);
  28.600 ns (0 allocations: 0 bytes)

julia> @btime minimum($c);
  241.071 ns (9 allocations: 144 bytes)

该变量c需要拆箱(由于未知元素类型),因此性能会降低一个数量级。

总之,真正重要的是参数类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编写一个valueStock函数,该函数将一组产品作为参数

来自分类Dev

编写一个函数,该函数将指向任何函数的指针作为参数

来自分类Dev

在 Julia 中,声明 AbstractVector{AbstractVector}

来自分类Dev

为什么promise.join()将函数作为其最后一个参数?

来自分类Dev

如何编写一个以“模式”作为参数的Python函数?

来自分类Dev

C:是否可能有一个将函数指针数组作为其参数之一的递归函数?

来自分类Dev

JS:如何编写一个函数,将另一个函数作为参数并返回一个函数

来自分类Dev

编写一个将字符串作为参数并显示字母的函数,使用python中的循环每行显示一个

来自分类Dev

创建一个将另一个函数作为参数的函数

来自分类Dev

PHP 将一个函数作为参数传递给另一个函数

来自分类Dev

将 lambda 函数作为参数传递并在方法体中给出其参数

来自分类Dev

如何在 Python 中编写一个以文件名作为参数的函数?

来自分类Dev

在Rust中编写一个将可迭代容器作为参数的泛型函数

来自分类Dev

是否可以编写一个将自身作为参数接收的函数?

来自分类Dev

如何编写一个接受列表作为参数并返回列表中值总和的函数?

来自分类Dev

AngularJS-单击对象,访问其ID并以该ID作为参数触发一个函数

来自分类Dev

定义一个函数 compute_bill 将一个参数 food 作为输入

来自分类Dev

将函数参数作为参数传递给python中的另一个函数

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

编写一个符号Matlab函数,该函数根据其参数而有所不同

来自分类Dev

如何编写一个使用参数调用函数的函数?

来自分类Dev

编写一个将字符串列表作为参数并返回包含每个字符串长度的列表的函数

来自分类Dev

React:编写一个函数作为道具传递

来自分类Dev

如何将内部函数值作为参数传递给其回调

来自分类Dev

使用其列作为参数将函数应用于DataFrame

来自分类Dev

编写一个接受测试分数数组作为参数的函数,然后该函数应该返回 80 或更高的分数?

来自分类Dev

接收函数作为另一个函数的参数

来自分类Dev

PHP函数作为另一个函数的参数

来自分类Dev

函数参数作为另一个函数的名称?

Related 相关文章

  1. 1

    编写一个valueStock函数,该函数将一组产品作为参数

  2. 2

    编写一个函数,该函数将指向任何函数的指针作为参数

  3. 3

    在 Julia 中,声明 AbstractVector{AbstractVector}

  4. 4

    为什么promise.join()将函数作为其最后一个参数?

  5. 5

    如何编写一个以“模式”作为参数的Python函数?

  6. 6

    C:是否可能有一个将函数指针数组作为其参数之一的递归函数?

  7. 7

    JS:如何编写一个函数,将另一个函数作为参数并返回一个函数

  8. 8

    编写一个将字符串作为参数并显示字母的函数,使用python中的循环每行显示一个

  9. 9

    创建一个将另一个函数作为参数的函数

  10. 10

    PHP 将一个函数作为参数传递给另一个函数

  11. 11

    将 lambda 函数作为参数传递并在方法体中给出其参数

  12. 12

    如何在 Python 中编写一个以文件名作为参数的函数?

  13. 13

    在Rust中编写一个将可迭代容器作为参数的泛型函数

  14. 14

    是否可以编写一个将自身作为参数接收的函数?

  15. 15

    如何编写一个接受列表作为参数并返回列表中值总和的函数?

  16. 16

    AngularJS-单击对象,访问其ID并以该ID作为参数触发一个函数

  17. 17

    定义一个函数 compute_bill 将一个参数 food 作为输入

  18. 18

    将函数参数作为参数传递给python中的另一个函数

  19. 19

    如何将参数传递给作为另一个函数参数的函数

  20. 20

    编写一个符号Matlab函数,该函数根据其参数而有所不同

  21. 21

    如何编写一个使用参数调用函数的函数?

  22. 22

    编写一个将字符串列表作为参数并返回包含每个字符串长度的列表的函数

  23. 23

    React:编写一个函数作为道具传递

  24. 24

    如何将内部函数值作为参数传递给其回调

  25. 25

    使用其列作为参数将函数应用于DataFrame

  26. 26

    编写一个接受测试分数数组作为参数的函数,然后该函数应该返回 80 或更高的分数?

  27. 27

    接收函数作为另一个函数的参数

  28. 28

    PHP函数作为另一个函数的参数

  29. 29

    函数参数作为另一个函数的名称?

热门标签

归档