やっていること
NumPyを使った計算高速化について体感、理解するため、以下サイトを参考に勉強中です。
https://www.labri.fr/perso/nrougier/from-python-to-numpy/
サイトの事例
ここに高速化の事例として、以下のようなコードが提示されています。
これら2つの関数の実行時間を比較した結果が以下だそうで、ケタ違いにNumpyが速いと言っています。
自分でやってみた結果
python3
1def add_python(Z1, Z2): 2 return [z1 + z2 for (z1, z2) in zip(Z1, Z2)] 3 4def add_numpy(Z1, Z2): 5 return np.add(Z1, Z2) 6 7Z1 = random.sample(range(1000), 100) 8Z2 = random.sample(range(1000), 100)
timeitの書き方を変えて2パターン
- Numpyがちょっとだけ早い
%timeit ("add_python(Z1, Z2)", globals()) %timeit ("add_numpy(Z1, Z2)", globals()) 89.7 ns ± 3.92 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) 87.4 ns ± 0.848 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
- Numpyが遅い
%timeit add_python(Z1, Z2) %timeit add_numpy(Z1, Z2) 8.06 µs ± 80.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 15.1 µs ± 288 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
知りたいこと
A. なぜNumpyの方が遅くなってしまうのでしょうか。
B. おそらく、実際はNumpyの方が速いのではと思いますが、どなたか同じ方法で検証してみて頂けないでしょうか。
C. ついでに、timeitにglobals()を付けると結果が大きく変わるのはなぜでしょうか。
ちなみに...
本件と直接関係ありませんが、他のコードにて、
np.linalg.normが異常に遅く、普通のpythonのコードに書き換えたことがあります。
これはありえない?
a1 = np.random.randint(1,10, (2)) a2 = np.random.randint(1,10, (2)) l1 = [random.randint(1,10) for i in range(2)] l2 = [random.randint(1,10) for i in range(2)] #a1=[8 9], <class 'numpy.ndarray'> #a2=[9 1], <class 'numpy.ndarray'> #l1=[1, 7], <class 'list'> #l2=[9, 8], <class 'list'> %%timeit length1 = ((l2[0] - l1[0]) ** 2 + (l2[1] - l1[1]) ** 2) ** 0.5 #1.14 µs ± 18.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) %%timeit length2 = np.linalg.norm(a2 - a1) length2 #4.99 µs ± 301 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
環境
Python 3.7.1
Numpy 1.16.4
windows10
anaconda
jupyter notebook 5.7.4
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/25 04:15