流れに従ひて己を失はず.

日々の研究について書きます

ベクトル正規化(3次元)の速度比較

np.linalg.norm()を使うと遅い.
二乗和はぐりぐり計算して,平方根はmath.sqrt()を使うのが良い.
という話.


np.linalg.norm()を使うのと,np.dot()を使うのと,math.sqrt()を使うのと,愚直に計算するのではどれが一番速いか比べた.

ライブラリインポートとデータ作成

import numpy as np
import math

vec = np.random.rand(1000,3)


np.linalg.norm()を使った場合:9.32 ms

def vec_3d_length_np(v):
    return v/np.linalg.norm(v)

%%time
for _ in range(1000):
    vn = vec_3d_length_np(vec[_,:])

CPU times: user 8.94 ms, sys: 3.39 ms, total: 12.3 ms
Wall time: 9.32 ms


np.dot()を使った場合:7.08 ms

def vec_3d_length_npdot(v):
    return v/(np.dot(v,v))**(0.5)

%%time
for _ in range(1000):
    vn = vec_3d_length_npdot(vec[_,:])

CPU times: user 6.08 ms, sys: 4.31 ms, total: 10.4 ms
Wall time: 7.08 ms


math.sqrt()を使った場合:2.35 ms

def vec_3d_length_math(v):
    return v/math.sqrt(v[0]*v[0] + v[1]*v[1]+v[2]*v[2])

%%time
for _ in range(1000):
    vn = vec_3d_length_math(vec[_,:])

CPU times: user 2.33 ms, sys: 6 µs, total: 2.33 ms
Wall time: 2.35 ms


愚直に計算した場合:2.73 ms

def vec_3d_length_(v):
    return v/(v[0]**2 + v[1]**2+v[2]**2)**(0.5)

%%time
for _ in range(1000):
    vn = vec_3d_length_(vec[_,:])

CPU times: user 2.72 ms, sys: 3 µs, total: 2.72 ms
Wall time: 2.73 ms