shape
はタプルであり、望ましい結果もタプルです。 np.prod
またはその他の配列関数を使用するように配列を変換/変換するには時間がかかります。したがって、普通のPythonコードで同じことができれば、時間を節約することができます。 shape
と例えば
:
In [309]: shape
Out[309]: (2, 3, 4, 5)
In [310]: np.prod(shape)
Out[310]: 120
In [311]: functools.reduce(operator.mul,shape)
Out[311]: 120
In [312]: timeit np.prod(shape)
13.6 µs ± 30.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [313]: timeit functools.reduce(operator.mul,shape)
647 ns ± 12.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Pythonのバージョンが著しく高速です。 functools
とoperator
をインポートして、sum
(Python3)の倍数を得る必要がありました。
または新規の形状タプル取得する:
In [314]: axis=2
In [315]: (functools.reduce(operator.mul,shape[:axis]),shape[axis],-1)
Out[315]: (6, 4, -1)
In [316]: timeit (functools.reduce(operator.mul,shape[:axis]),shape[axis],-1)
739 ns ± 30.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
提案reduceat
を比較する:
In [318]: tuple(np.multiply.reduceat(shape, (0, axis, axis+1)))
Out[318]: (6, 4, 5)
In [319]: timeit tuple(np.multiply.reduceat(shape, (0, axis, axis+1)))
11.3 µs ± 21.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%のはtimeit(F(2).shape)ループ当たり489ナノ秒± 8.14マイクロ秒(平均±標準偏差7回、各100000ループ)あなたは本当にスピードに興味がありますか? ;) – NaN
金曜日の夜です。私は退屈だと思います。 'arr + = np.arange(arr.size、dtype = arr.dtype)'のようなものは同じ意味で少し狂っていますが、多くの人がそれを行います。これはC++の単なるループです... –
reduceatを下から使用するループあたり5.08μs±234ns(平均実行時間は7回、ループ回数は100000回です)ので、より多くの時間を手に入れます; – NaN