PSM

プログラミング 初心者の メモ書き です

np.sum()より早い方法

1.はじめに

サイズの小さなベクトルに対してnumpy.sum()より早い方法

例のごとくまったく知らないので調べるしかないですが,せっかくなので,本当に早いのか処理時間をはかるところまでやってみます.

やりたいことを切り分けると,結局以下の3つの方法を調べる必要がありました.

  1. numpy.sum()より早い総和の方法
  2. 時間の計測方法 
  3. 少数の表示を指定する方法

2.サンプルコード 早い総和

np.add.reduce()を使うとよいらしいです.

import numpy as np

# 要素数100のランダムなベクトル
z = np.random.random(100)

#いつもの
sum1 = np.sum(z)
#はやいやつ
sum1=np.add.reduce(z)

3.サンプルコード 処理時間の計測

np.datetime64()でもやれそうですが,とりあえず調べてでてきたtime.time()を使ってみます.

import numpy as np
import time

# 要素数100のランダムなベクトル
z = np.random.random(100)

start1 = time.time()
#総和をとる
sum1 = np.sum(z)
end1 = time.time()
passtime1=end1-start1
#計測時間を出力
print(passtime1)

4.サンプルコード 少数表示

上ででてきた計測時間をシチュエーションごとに比較したい.
そこで少数点の桁数を揃えて表示する必要があったので.これも調べました.
printの部分で,"%.8f"%passtime1のように書くと8桁,のように表示できました.

import numpy as np
import time

# 要素数100のランダムなベクトル
z = np.random.random(100)

start1 = time.time()
#総和をとる
sum1 = np.sum(z)
end1 = time.time()
passtime1=end1-start1
#計測時間を出力
print("%.8f"%passtime1)

5.サンプルコード 比較

というわけで全シチュエーションについて出力すると

import numpy as np
import time

z = np.random.random(100)

start1 = time.time()
sum1 = np.sum(z)
end1 = time.time()
passtime1=end1-start1

start2 = time.time()
sum2 = np.add.reduce(z)
end2 = time.time()
passtime2=end2-start2

z = np.random.random(10000000)
start3 = time.time()
sum3 = np.sum(z)
end3 = time.time()
passtime3=end3-start3

start4 = time.time()
sum4 = np.add.reduce(z)
end4 = time.time()
passtime4=end4-start4

print("%.8f"%passtime1,"%.8f"%passtime2,"\n","%.8f"%passtime3,"%.8f"%passtime4)
0.00014186 0.00010800 
0.00583005 0.00585008

5.まとめ

というわけで,やっぱりサイズの小さいベクトルに対してはadd.reduce()の方が早いようでした.
調べたところによると,np.sum()ってのが小さいベクトルに対しては結局内部的にadd.reduce()を呼び出しているので,そりゃadd.reduce()をそのまま使った方が早いよね,とのことでした.

それでは.