英文:
In Julia, are there cpu/memory dissadvantages when functions that modify their arguments return nothing?
问题
我有一个关于在Julia中声明函数的一般问题。如果我的新函数修改其参数之一,它应该返回:
a. 修改后的参数?
或者
b. 什么都不返回?
我的意思是,如果函数修改其参数,即使函数不返回参数,我也会在相应对象中看到修改。
返回/不返回修改后的参数会有什么缺点/优点。
这里有一个例子:
英文:
I have a general question about how to declare functions in Julia. If my new function modifies one of its parameters, should it return:
a. the modified parameter?
or
b. nothing?
I mean, if the function modifies its argument, I will see the modifications in the respective object even if the function does not return it.
What would be the dissadvantages/advantages or returning/not returning the modified parameter.
An example here:
julia> a= [2,3,5]
3-element Vector{Int64}:
2
3
5
#Variant 1, the function returns its modified argument
julia> function addA!(a)
a .= a .+ 5
return a
end
addA! (generic function with 1 method)
julia> addA!(a)
3-element Vector{Int64}:
7
8
10
#Variant 2, the function returns nothing
function addA!(a)
a .= a .+ 5
return nothing
end
addA!
addA!(a)
答案1
得分: 3
第一个变体在Julia标准库中广泛使用,因此通常更受青睐。例如,请参阅push!、map!、rand!、mul!等。这种风格符合Julia的“一切皆表达式”哲学,并且很方便,因为函数通常可以被它们的原地版本替代,而不需要其他任何更改:例如,sort(filter(isodd, A)) => sort!(filter!(isodd, A))。它还使得实现原地函数的分配版本变得容易:
foo(A) = foo!(copy(A)) # 标准库中的常见习惯
在性能方面没有不利之处。
英文:
The first variant is used extensively in the Julia standard libraries, so this style is preferred in general. For instance see push!, map!, rand!, mul!, etc. This style fits with Julia's "everything is an expression" philosophy, and is convenient because functions can often be substituted with their in-place versions without any other changes: e.g. sort(filter(isodd, A)) => sort!(filter!(isodd, A)). It also makes implementing the allocating version of an in-place function easy:
foo(A) = foo!(copy(A)) # common idiom in the stdlib
There's no disadvantage in terms of performance.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论