Có thư viện chuẩn / numpy tương đương với chức năng sau không:
def augmented_assignment_sum(iterable, start=0):
for n in iterable:
start += n
return start
?
Mặc dù sum(ITERABLE)
rất thanh lịch, nó sử dụng +
toán tử thay vì +=
, trong trường hợp các np.ndarray
đối tượng có thể ảnh hưởng đến hiệu suất.
Tôi đã kiểm tra rằng chức năng của tôi có thể nhanh như vậy sum()
(trong khi việc sử dụng tương đương của nó +
chậm hơn nhiều). Vì nó là một hàm Python thuần túy, tôi đoán hiệu năng của nó vẫn bị khuyết tật, do đó tôi đang tìm kiếm một số thay thế:
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)
Tôi đã cố gắng sử dụng functools.reduce
kết hợp với operator.iadd
, nhưng hiệu suất của nó là tương tự:
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)
Tôi cũng quan tâm đến hiệu quả bộ nhớ, do đó thích các bài tập tăng cường vì chúng không yêu cầu tạo các đối tượng trung gian.
374 ms ± 83.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
:-( Mặc dù nó nhanh hơn đáng kể nếu ARRAYS
là mảng 2D.
axis=0
. Sau đó, phải mất 355 ms ± 16.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
:-( Trong nội bộ, nó sử dụng np.add.reduce()
(numpy v. 1.15.4)
np.dot(your_array, np.ones(len(your_array)))
. Nên chuyển sang BLAS và nhanh chóng hợp lý.
np.add.reduce(ARRAYS)
?