多くのベンチマークと同様に、これは実際には状況の詳細に依存します。デフォルトでは、numpy が C 連続 (行優先) 順序で配列を作成することは事実です。そのため、抽象的には、列をスキャンする操作は、行をスキャンする操作よりも高速である必要があります。ただし、配列の形状、ALU のパフォーマンス、およびプロセッサの基盤となるキャッシュは、詳細に大きな影響を与えます。
たとえば、私の MacBook Pro では、小さな整数または浮動小数の配列を使用して、時間は似ていますが、小さな整数型は浮動小数点型よりも大幅に遅くなります。
>>> x = numpy.ones((100, 100), dtype=numpy.uint8)
>>> %timeit x.sum(axis=0)
10000 loops, best of 3: 40.6 us per loop
>>> %timeit x.sum(axis=1)
10000 loops, best of 3: 36.1 us per loop
>>> x = numpy.ones((100, 100), dtype=numpy.float64)
>>> %timeit x.sum(axis=0)
10000 loops, best of 3: 28.8 us per loop
>>> %timeit x.sum(axis=1)
10000 loops, best of 3: 28.8 us per loop
配列が大きくなると、絶対差は大きくなりますが、少なくとも私のマシンでは、データ型が大きいほど差は小さくなります。
>>> x = numpy.ones((1000, 1000), dtype=numpy.uint8)
>>> %timeit x.sum(axis=0)
100 loops, best of 3: 2.36 ms per loop
>>> %timeit x.sum(axis=1)
1000 loops, best of 3: 1.9 ms per loop
>>> x = numpy.ones((1000, 1000), dtype=numpy.float64)
>>> %timeit x.sum(axis=0)
100 loops, best of 3: 2.04 ms per loop
>>> %timeit x.sum(axis=1)
1000 loops, best of 3: 1.89 ms per loop
、、などのorder='F'
キーワード引数を使用するか、 を使用して既存の配列を変換することにより、Fortran 連続 (列優先) 配列を作成するように numpy に指示できます。予想どおり、この順序付けは行または列操作の効率を入れ替えます。numpy.asarray
numpy.ones
numpy.zeros
numpy.asfortranarray
in [10]: y = numpy.asfortranarray(x)
in [11]: %timeit y.sum(axis=0)
1000 loops, best of 3: 1.89 ms per loop
in [12]: %timeit y.sum(axis=1)
100 loops, best of 3: 2.01 ms per loop