web-dev-qa-db-ja.com

NumPy数学関数はPythonよりも高速ですか?

基本的な数学関数(abs、cosh、sinh、exp、...)の組み合わせで定義された関数があります。

たとえば、numpy.abs()の代わりにabs()を使用すると、(速度で)違いが生じるかどうか疑問に思っていました。

57
Mermoz

タイミングの結果は次のとおりです。

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個の要素の場合のほうがそれほど時間はかかりません!

73
Eric O Lebigot

Numpyの型を処理するにはnumpy関数を使用し、通常のpython型を処理するには通常のpython関数を使用します。

通常、最悪のパフォーマンスはpython組み込み型とnumpyを組み合わせた場合、型変換のために発生します。これらの型変換は最近最適化されました。 、プロファイリングツールを使用して把握します。

プログラムをさらに最適化する場合は、cythonなどのプログラムの使用やCモジュールの作成も検討してください。または、パフォーマンスが重要な場合はpythonを使用しないことを検討してください。

しかし、データがnumpy配列に入れられると、numpyは大量のデータを非常に高速に計算できます。

25
BatchyX

実際、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
5
colinfang