繁体   English   中英

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

[英]Is there a faster way to sum up an arithmetic sequence of numbers in Python?

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

抱歉,如果这很基本,但是我有很多这样的东西,它们占用的空间比舒适的还要多。

total = sum(range(upper))

要么

total = upper * (upper - 1) / 2

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

编辑:当不从零开始时:

total = sum(range(lower, upper))

还是再次根据高斯(Gauss),对upper进行相同操作,对lower进行相同操作减去:

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

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

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时,很小但在理论上很有趣:我的答案仅包含两个乘法/除法(比加法/减法相对昂贵),而另一个答案包含四个。

扩展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的语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM