2017-04-13 20 views
4

Python/NumPyの3つの "all"メソッドの違いは何ですか?パフォーマンスの違いは何故ですか? ndarray.all()が常に3つの中で最も速いのは本当ですか?ここでNumPy ndarray.all()vs np.all(ndarray)vsすべて(ndarray)

は、私が走ったタイミングテストです:

In [59]: a = np.full(100000, True, dtype=bool) 

In [60]: timeit a.all() 
The slowest run took 5.40 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 5.24 µs per loop 

In [61]: timeit all(a) 
1000 loops, best of 3: 1.34 ms per loop 

In [62]: timeit np.all(a) 
The slowest run took 5.54 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 6.41 µs per loop 

答えて

5

np.all(a)a.all()の違いは単純です:

  • anumpy.arrayであれば、np.all()は、単にa.all()を呼び出します。
  • anumpy.arrayでない場合、np.all()コールではnumpy.arrayに変換され、a.all()となります。一方、anumpy.arrayではなかったため、は失敗し、おそらくはallメソッドがありません。

np.allallの違いはより複雑です。

  • all関数は(listset S、generators、...を含む)の任意のiterable上で動作します。 np.allは、numpy.array(numpy配列に変換できるものすべて、つまりlisttuple)を対象としています。
  • np.allは、特定のデータ型を持つarrayを処理するため、!= 0を比較するとかなり効率的です。 allただし、各項目のboolを評価する必要があります。これははるかに遅いです。
  • 配列の各項目をPythonオブジェクトに変換する必要があるため、Python関数で配列を処理するのはかなり遅いです。 np.allはその変換を行う必要はありません。

タイミングは、aのタイプによっても異なります。あなたがPythonリストを処理するならば、比較的短いリストのために速くすることができるall。配列を処理する場合、object配列を除いて、ほとんどすべてのケースでnp.alla.all()の方が高速になりますが、その方法は狂気になります。

+0

Pythonの 'all'は' a'を繰り返します。すべての(a)、すべて(iter(a))、すべて(list(a))、すべて(a.tolist())しかし、「すべて」は短絡する可能性があります。 'a [2] = False'を設定し、非常に異なる時を見ます。 – hpaulj

+0

'np.all'も短絡していますか?また、 'all(a.tolist())'は私のコンピュータの 'all(a)'よりもはるかに高速です(2-3回)。これは主に、 'tolist'メソッドが配列をPythonオブジェクトのリストとしてラップするために最適化されているためです。 – MSeifert

1

私はこの

  • np.allでスイングを取るよの下で、異なるデータ型で動作する汎用的な機能でありますフードはおそらくndarray.allを探しています。その理由は少し遅いです。

  • allは、python bulit-in関数であるhttps://docs.python.org/2/library/functions.html#allを参照してください。

  • ndarray.allは、 'numpy.ndarray'オブジェクトのメソッドです。これを直接呼び出す方が高速です。

+0

減速の原因となっているインプリメンテーションで何が起こっているのかはっきりと説明できますか? – dkv

0

私は要素がすでにブール値であるため、組み込みall()は、何もしませんしながら、numpyのの機能は、いくつかの一般的な数値最初の方法で、おそらくbooleanとして配列要素を、評価するために多くを行うことを疑います。

浮動小数点の整数で結果がどのように違うのだろうか。

+0

要素は既に 'bool'ではありません。彼らは 'numpy.bool_'です。同じように振る舞いますが、同じではありません。np.bool_はブールではありません。 – MSeifert

関連する問題