次の関数に相当する標準ライブラリ/ numpyがありますか?
def augmented_assignment_sum(iterable, start=0):
for n in iterable:
start += n
return start
?
一方でsum(ITERABLE)
非常にエレガントで、それが使用する+
演算子を代わりに+=
した場合にどの、np.ndarray
オブジェクトのパフォーマンスに影響を与える可能性があります。
私は私の機能が同じくらい速いかもしれないことをテストしましたsum()
(それと同等の使用+
ははるかに遅いです)。それは純粋なPython関数なので、そのパフォーマンスはまだハンディキャップがあると思います。したがって、いくつかの代替策を探しています。
In [49]: ARRAYS = [np.random.random((1000000)) for _ in range(100)]
In [50]: def not_augmented_assignment_sum(iterable, start=0):
...: for n in iterable:
...: start = start + n
...: return start
...:
In [51]: %timeit not_augmented_assignment_sum(ARRAYS)
63.6 ms ± 8.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [52]: %timeit sum(ARRAYS)
31.2 ms ± 2.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [53]: %timeit augmented_assignment_sum(ARRAYS)
31.2 ms ± 4.73 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [54]: %timeit not_augmented_assignment_sum(ARRAYS)
62.5 ms ± 12.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [55]: %timeit sum(ARRAYS)
37 ms ± 9.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [56]: %timeit augmented_assignment_sum(ARRAYS)
27.7 ms ± 2.53 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
私はとfunctools.reduce
組み合わせて使用しようとしましたoperator.iadd
が、そのパフォーマンスは似ています:
In [79]: %timeit reduce(iadd, ARRAYS, 0)
33.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [80]: %timeit reduce(iadd, ARRAYS, 0)
29.4 ms ± 2.31 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
また、メモリ効率にも関心があります。中間オブジェクトの作成を必要としないため、拡張割り当てをお勧めします。
@DanielMesejo悲しいことに
—
abukaj
374 ms ± 83.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
:-( ARRAYS
2D配列の方がかなり高速ですが
—
ダニMesejo
@DanielMesejoで呼び出されない限り、スカラーを返します
—
abukaj '15年
axis=0
。それから355 ms ± 16.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
:-(内部的に使用しますnp.add.reduce()
(numpy v。1.15.4)
についてはどうですか
—
user228395
np.dot(your_array, np.ones(len(your_array)))
。BLASに転送し、かなり迅速に処理する必要があります。
np.add.reduce(ARRAYS)
?