python - 最大限度。对数组的各个部分求和的有效方法
问题描述
我正在尝试找到一种更有效的方法来执行以下任务。
该功能正在被提供一些列表。我需要:
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
先感谢您。
解决方案
一个版本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
推荐阅读
- c# - 有没有更短、更好和优化的方法来从 SQL 数据库中填充这个列表
- python - 为什么相同的数据类型变量会给出不同的响应?
- sql - 如何使用来自 2 个孩子的总和创建更新父字段的触发器
- google-sheets - 检查单元格是否包含所有逗号分隔值
- npm - WebStorm npm 脚本:ng build --prod
- spring - IgnoreCase Finder 不适用于 Spring Data Rest 和 Neo4J
- angular - Angular 应用程序中的 Angular Material mat-select 下划线颜色变化
- java - Intellij Windows 10 SQLite 访问被拒绝
- python - 从 URL 创建 ipynb
- shell - 从命令输出中检索值