0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

会社で「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の達人の方、情報いただけるとありがたいです・・・!)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?