基本的な数学関数(abs、cosh、sinh、exp、...)の組み合わせで定義された関数があります。
たとえば、numpy.abs()
の代わりにabs()
を使用すると、(速度で)違いが生じるかどうか疑問に思っていました。
タイミングの結果は次のとおりです。
lebigot@weinberg ~ % python -m timeit 'abs(3.15)'
10000000 loops, best of 3: 0.146 usec per loop
lebigot@weinberg ~ % python -m timeit -s 'from numpy import abs as nabs' 'nabs(3.15)'
100000 loops, best of 3: 3.92 usec per loop
numpy.abs()
は、Numpy配列も処理するため、abs()
よりも低速です。この柔軟性を提供する追加のコードが含まれています。
ただし、Numpy is配列では高速:
lebigot@weinberg ~ % python -m timeit -s 'a = [3.15]*1000' '[abs(x) for x in a]'
10000 loops, best of 3: 186 usec per loop
lebigot@weinberg ~ % python -m timeit -s 'import numpy; a = numpy.empty(1000); a.fill(3.15)' 'numpy.abs(a)'
100000 loops, best of 3: 6.47 usec per loop
(PS:'[abs(x) for x in a]'
は、Python 2.7では、優れたmap(abs, a)
よりも遅く、約30%高速です。これは、NumPyよりもはるかに遅いです。)
したがって、numpy.abs()
は、1つのフロートの場合よりも1000個の要素の場合のほうがそれほど時間はかかりません!
Numpyの型を処理するにはnumpy関数を使用し、通常のpython型を処理するには通常のpython関数を使用します。
通常、最悪のパフォーマンスはpython組み込み型とnumpyを組み合わせた場合、型変換のために発生します。これらの型変換は最近最適化されました。 、プロファイリングツールを使用して把握します。
プログラムをさらに最適化する場合は、cythonなどのプログラムの使用やCモジュールの作成も検討してください。または、パフォーマンスが重要な場合はpythonを使用しないことを検討してください。
しかし、データがnumpy配列に入れられると、numpyは大量のデータを非常に高速に計算できます。
実際、numpy配列で
組み込みabs
は__abs__
を介してnumpyの実装を呼び出します。 absのような組み込み関数がnumpy配列で機能する理由
そのため、理論的にはパフォーマンスに大きな違いはありません。
import timeit
x = np.random.standard_normal(10000)
def pure_abs():
return abs(x)
def numpy_abs():
return np.absolute(x)
n = 10000
t1 = timeit.timeit(pure_abs, number = n)
print 'Pure Python abs:', t1
t2 = timeit.timeit(numpy_abs, number = n)
print 'Numpy abs:', t2
Pure Python abs: 0.435754060745
Numpy abs: 0.426516056061