結論から言うと...
関数の引数に関数を渡した場合,実行時間が増えることがわかった(自明な気もするが).
特にループ処理内で
FUNCTION(function, a, b, c...)
の形を作ると,実行時間に大きな差が生じるので注意が必要.
検証方法
以下のコードを実行した
import time
#足し算の関数
def my_add(a,b):
return a+b
#関数my_funcを受け取り,my_func(x,y)を返す関数
def arg_func(my_func,x,y):
return my_func(x,y)
#2数の和を返す関数
def no_arg_func(x,y):
return x+y
sum1=0
sum2=0
start1=time.time()
for i in range(1000):
sum1=arg_func(my_add,sum1,1)
end1=time.time()
start2=time.time()
for j in range(1000):
sum2=no_arg_func(sum2,1)
end2=time.time()
結果は以下の通り
0.00019788742065429688 ⬅️ 関数arg_func(...) に add_func(...)に渡した場合
0.0001430511474609375 ⬅️ 関数no_arg_func(...)内で直接足し算を行なった場合
関数の引数に関数を渡した場合,関数内に直接処理を書いた場合よりも約1.3倍時間がかかっていることがわかる.
終わりに
今回のは一例であり,forループの反復回数を変えると割合が変わる.
例えば,forループの回数が10の場合は実行時間に約3倍の差があるが,これが10^7回だと1.1倍の差しかない.他の条件によっても結果は変わると思う.
ただ,優先度が 実行速度>コードの可読性の場合は,関数を引数に渡さないのが無難だと思う