python中的有界累积和没有循环

问题描述

我需要执行一个有界限的累积求和 - 有点像电容器的充电状态。它不能超过其最大充电量,也不能低于 0。例如:

Initial  Cumulative Sum Constrained Sum
 1        1               1
 7        8               8
 5        13              10
 -8       5               2
 -7       -2              0
 3        1               3

我有一段代码

charge_0 = 0
for i in range (1,len(charge_discharge)):
    charge_1 = min(battery_size,max(0,(charge_0+charge_discharge[i])))
    StorageSOC.append(charge_1)
    charge_0 = charge_1

它比其他一些选项运行得更快,但我知道它没有优化。一个简单的累积总和要快几个数量级,所以我相信有更好的方法来做到这一点。我不能只是在边界处应用剪辑。没有 for 循环的正确方法是什么?

解决方法

你不需要旧的和新的。而且您正在跳过元素 0。这会快一点,但我不相信您可以消除循环。

charge = 0
for delta in charge_discharge:
    charge = min(battery_size,max(0,charge+delta))
    StorageSOC.append(charge)
,

在示例中,未定义 j0 和 j1。这篇文章不涉及累积和,请参阅mwe以正确使用问题

在 numpy 或 pandas 上使用矢量方法可以更快,两者都有 cumsum 操作。