首页 > 解决方案 > 最大限度。对数组的各个部分求和的有效方法

问题描述

我正在尝试找到一种更有效的方法来执行以下任务。

该功能正在被提供一些列表。我需要:

1)找到列表的总和并将结果存储在专门为此准备的另一个列表中。

2)删除输入列表的第一个元素

3) 找到新列表的总和并附加到步骤 1 中的列表。

4) 重复直到输入列表为空。

基本上,下面的代码已经完成了任务,但在速度方面效率低下(据我所知,append 方法不是 Python 库中最精简的工具)。什么是更有效的方法?

def parts_sums(ls):
    sums = []

    if len(ls) == 0:
            sums.append(0)

    while len(ls) > 0:
        sums.append(sum(ls))
        ls.pop(0)

        if len(ls) == 0:
            sums.append(0)

    return sums

先感谢您。

标签: pythonalgorithm

解决方案


一个版本itertools.accumulate

from itertools import accumulate
import timeit

l = [1,4,2,5]
i = [*accumulate(reversed(l + [0]))][::-1]

print(i)

l = [*range(10_000)]
print(timeit.timeit(lambda: [*accumulate(reversed(l + [0]))][::-1], number=1000))

l = [*range(100_000)]
print(timeit.timeit(lambda: [*accumulate(reversed(l + [0]))][::-1], number=100))

打印(在 AMD 2400G 上):

[12, 11, 7, 5, 0]
0.28572049700596835
0.45740387199475663

编辑(使用parts_sums1()parts_sums2()来自接受的答案):

0.6355529940046836  # parts_sums1()/10_000 items/1000 iterations
0.7757905749967904  # parts_sums1()/100_000 items/100 iterations 
0.5660922379975091  # parts_sums2()/10_000 items/1000 iterations
0.749676775005355   # parts_sums2()/100_000 items/100 iterations

推荐阅读