Julia中修改参数的函数:返回参数或nothing的优劣及性能疑问
Julia中原地修改函数的返回值选择问题
一、返回nothing是否存在CPU或内存劣势?
几乎没有。Julia里的对象(比如数组)都是引用类型,返回原参数本质上只是返回一个引用,不会额外拷贝内存;而返回nothing是返回一个全局单例对象,同样没有额外内存开销。CPU层面,Julia的JIT编译器会对这两种情况做等价优化,执行效率几乎没有差异,只有在极端高频调用的场景下才可能出现可忽略的差别,日常开发完全不用在意。
二、两种返回方式的优缺点对比
返回修改后的参数(Variant 1)
- 优点:
- 支持链式调用,比如可以直接写
addA!(a) |> println,或者把函数结果直接传给其他需要该对象的函数,代码更简洁灵活。 - 符合Julia内置原地修改函数的惯例(比如
push!、sort!、filter!等都是返回修改后的对象),用户使用时更符合直觉,减少学习成本。
- 支持链式调用,比如可以直接写
- 缺点:
- 对Julia新手来说,可能会误以为函数返回了新对象,但实际上是原地修改——不过只要遵循
!结尾表示原地修改的命名规范,这个问题可以避免。
- 对Julia新手来说,可能会误以为函数返回了新对象,但实际上是原地修改——不过只要遵循
返回nothing(Variant 2)
- 优点:
- 明确传递“函数仅做原地修改,无返回值”的信号,完全消除返回新对象的误解,语义更直白。
- 缺点:
- 无法链式调用,必须分两步写(先调用
addA!(a),再单独处理a),代码灵活性降低。 - 不符合Julia社区的通用惯例,其他开发者阅读代码时可能会感到困惑,因为大部分带
!的函数都返回修改后的对象。
- 无法链式调用,必须分两步写(先调用
示例代码
# 定义数组 a = [2,3,5] # Variant 1:返回修改后的参数 function addA!(a) a .= a .+ 5 return a end addA!(a) # 输出修改后的数组 # Variant 2:返回nothing function addA!(a) a .= a .+ 5 return nothing end addA!(a) # 无输出(仅原地修改a)
内容的提问来源于stack exchange,提问作者LilPyth
相关产品推荐
相关产品推荐

