有没有更快的方法来总结Python中的算术数字序列?

时间:2012-06-04 14:02:58

标签: python

total = 0
for i in range(0, some upper bound):
    total += i

很抱歉,如果这是基本的,但我有很多这些,而且他们占用的空间比舒适的还多。

3 个答案:

答案 0 :(得分:15)

total = sum(range(upper))

total = upper * (upper - 1) / 2

第一个是Python,第二个是高斯。

编辑:当不从零开始时:

total = sum(range(lower, upper))

或者,再次根据高斯,对upper执行相同的操作,并为lower减去相同的内容:

total = upper * (upper - 1) / 2 - lower * (lower - 1) / 2

如果您使用的是Python 2.x,请将所有range替换为xrange

答案 1 :(得分:2)

total = some_upper_bound * (some_upper_bound -1) / 2

如果lower_bound != 0

total = (some_upper_bound - lower_bound) * (some_upper_bound + lower_bound - 1) / 2

更新:我会删除我的答案,因为它几乎是所接受答案部分的精确副本(虽然我是独立回答的)。然而,当涉及lower_bound时,有一个 - 非常小但理论上有趣的改进:我的答案只包含两个乘法/除法(比加法/减法相对更昂贵),而另一个答案包含四个。

答案 2 :(得分:0)

扩展eumiro。为清晰起见,您可能希望编写一个封装高斯方法的方法。我会建议像这样的东西(用Groovy编写因为我不懂Python语法):

public int sumUpToBoundary(def upper_bound){
    return (upper_bound) * (upper_bound - 1) / 2;
}

public int sumBetween(def lower_bound, def upper_bound){
    return sumUpToBoundary(upper_bound) - sumUpToBoundary(lower_bound);
}

public void someOtherMethod() {
    int total = sumUpToBoundary(some_upper_bound);
    int total2 = sumBetween(some_lower_bound, some_upper_bound);
}

更新:@mspy注意到我的方法签名不符合Python的风格。我已经将示例更新为groovy,它支持更多类似Python的语法。