Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,有没有更快的方法来计算算术数字序列的总和?_Python - Fatal编程技术网

在Python中,有没有更快的方法来计算算术数字序列的总和?

在Python中,有没有更快的方法来计算算术数字序列的总和?,python,Python,对不起,如果这是基本的,但我有很多这样的,他们占用了更多的空间比舒适 total = 0 for i in range(0, some upper bound): total += i 或 第一个是Python,第二个是Gauss 编辑:不从零开始时: total = upper * (upper - 1) / 2 或者,同样按照高斯的说法,对上部做同样的操作,并对下部做相同的减法: total = sum(range(lower, upper)) 如果您使用的是Python2.x

对不起,如果这是基本的,但我有很多这样的,他们占用了更多的空间比舒适

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

第一个是Python,第二个是Gauss

编辑:不从零开始时:

total = upper * (upper - 1) / 2
或者,同样按照高斯的说法,对
上部
做同样的操作,并对
下部
做相同的减法:

total = sum(range(lower, upper))

如果您使用的是Python2.x,请将所有
range
替换为
xrange
total=some\u upper\u bound*(some\u upper\u bound-1)/2

如果
下限!=0

total=(一些上限-下限)*(一些上限+下限-1)/2


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

在eumiro上展开。为了清晰起见,您可能需要编写一个封装高斯方法的方法。我建议这样做(用Groovy编写,因为我不懂Python语法):


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

您想要更快或更短的代码吗?理想情况下,越短越好!是否存在折衷?是的,使用
sum
的解决方案更具可读性,
Gauss
函数更快。这非常有效!非常感谢。对于不是从0开始的情况,我是否只进行求和(范围(下限、上限))?如果之后使用生成器,则应始终使用生成器而不是iterables。在这种情况下,您应该使用
xrange
而不是
range
。xrange和range之间有什么区别?@user1435323 xrange/range:@user1435323基本上是的,但是您最好使用
xrange
(因为内存消耗较少)。这是一个好主意,但这个Java示例严格违反了Python原则。在名称中主要使用数据类型是一个非常糟糕的主意,我们在这里使用duck类型;-)@ms4py-虽然我希望读者能够将我的答案翻译成适合他们语言的风格,但我接受你的观点,我没有用Python回答。我已经将我的答案编辑为Groovy,它支持更多Python-y语法。(请删除-1)。
total = sum(range(lower, upper))
total = upper * (upper - 1) / 2 - lower * (lower - 1) / 2
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);
}