会社で「asscalar()が使えなくなった」という叫びが聞こえました。
勉強不足だったのですが、asscalar()なんて初耳で、
調べてみるとnumpy v1.23.0でたしかに消えてました。
The alen and asscalar functions have been removed.
(gh-20414)
このasscalar()は、コードコメント(実行時のワーニング)を見ると、
どうやらndarray.item()に置き換えるのが良さそう...
DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
しかし、私は思いました。index指定のほうが早いんちゃう?と。
関数コール挟むよりアドレス参照したほうが早いでしょ?と。(C言語脳)
そんなわけで、会社の叫んでいた人に、
「公式的にはitem()だけど、index指定のほうが早いで」
と布教するために実測することにしました。
検証コード
import numpy as np
import datetime
def print_time(func, func_name, n=100000):
start_time = datetime.datetime.now()
for i in range(n):
func()
end_time = datetime.datetime.now()
elapsed_time = end_time - start_time
print("処理時間:", func_name + "\t", elapsed_time, "/", n )
a = np.array([[[123]]])
print_time(lambda: np.asscalar(a), "asscalar")
print_time(lambda: a.item(), "item ")
print_time(lambda: a[0, 0, 0], "index ")
結果
実行環境; Ubuntu18.04(!) Python 3.7(!!) のレガシーすぎる環境において
処理時間: asscalar 0:00:00.310041 / 100000
処理時間: item 0:00:00.028772 / 100000
処理時間: index 0:00:00.050342 / 100000
となりました。
なんとitem()のほうが早かったのです。
やっぱり調べて実測してみないとわかんないもんですね;;
反省です。
ちゃんとitem()を布教するようにします。
ちなみにitem()の実装がどのようになっているかも調べたかったのですが、コード見つけれず時間切れでした。。
(numpyの達人の方、情報いただけるとありがたいです・・・!)