您可以使用算术级数之和的公式,而不是遍历范围中的每个项目并将它们相加,如下所示:
def sum_range(*args):
# parse the arguments, using the same positional notation as range()
lo,hi,step = [
lambda args: (0, args[0], 1),
lambda args: (args[0], args[1], 1),
lambda args: args
][len(args)-1](args)
# make sure we handle negative steps properly
flip_sign = (step < 0)
if flip_sign:
lo,hi,step = -lo,-hi,-step
# and do the actual calculation
items = (hi - lo + step - 1) // step
if items <= 0:
return 0
else:
total = (2*lo + (items-1)*step) * items // 2
return -total if flip_sign else total
然后你可以像使用它一样
print sum_range(2, 1000, 3) + sum_range(4, 996, 5)
出于兴趣,我对 Frédéric Hamidi 的回答进行了比较时间:
其中 x 轴是范围内的项目数,y 轴是运行时间,我的算法是绿色的,他的算法是蓝色的。正如预期的那样,他的算法的运行时间与项目数成正比,而我的算法是恒定的,交点约为 75 个项目。