この記事を読むまで、スカラー計算とベクトル計算の速度がなぜ違うのかといつも思っていました。
次の実験:
forループを使用します。
import numpy as np
ls=[i+8 for i in range(1<<25)]
arrs=np.array(ls)
#定义一个对每个元素都加8的函数
def add_8(nums):
for i in range(len(nums)):
nums[i]+=8
return nums
%timeit add_8(arrs)
結果:ループあたり9.1秒±308ミリ秒(7回の実行の平均±標準偏差、各1ループ)
forループなし:
import numpy as np
ls=[i+8 for i in range(1<<25)]
arrs=np.array(ls)
%timeit arrs+8
結果:ループあたり30.9ms±27.5µs(7回の実行の平均±標準偏差、各10ループ)
ギャップが大きすぎる
forループの使用はスカラー計算であり、一般関数(ここでの追加)の使用はベクトル計算と同等です。
ただし、forループを使用する場合は、numbaを使用する必要があります
効果を見てみましょう
import numpy as np
from numba import jit
ls=[i+8 for i in range(1<<25)]
arrs=np.array(ls)
#定义一个对每个元素都加8的函数
@jit(nopython=True)
def add_8(nums):
for i in range(len(nums)):
nums[i]+=8
return nums
%timeit add_8(arrs)
結果:ループあたり17.6ms±57.2µs(7回の実行の平均±標準偏差、各100ループ)
効果は一般的な機能よりも優れており、numbaは神になります