我正在使用
创建一个列表sum_range=list(2**x for x in range(start_range,end_range+1))
这里start_range和end_range取大值从0到大约4百万。
这行代码似乎是瓶颈。 最终我想要列表sum_range中所有数字的总和。有可能有更好的方法吗?
时间: -
start_range = 188640 end_range = 197280
代码大约需要6秒才能在我的系统上运行。
答案 0 :(得分:4)
2**n
的总和是代数已知的。对于n = 0到m,它是:2**(m+1)-1
。
因此,如果您想从a到b(包括)知道它,请2**(b+1) - 2**(a+1) + 2**a
。查找一般情况下的几何系列。
答案 1 :(得分:1)
尝试使用"<<"
运算符代替"**"
,它还可以将计算时间从4.0~5.0 seconds
大大节省到0.07~0.33 seconds
。
import datetime
t_start_1 = datetime.datetime.utcnow()
sum_range_1 = list(1<<x for x in range(188640,197280))
t_end_1 = datetime.datetime.utcnow()
print "using '<<' cost: " + str(t_end_1 - t_start_1) + "seconds"
t_start_2 = datetime.datetime.utcnow()
sum_range_2 = list(2**x for x in range(188640,197280))
t_end_2 = datetime.datetime.utcnow()
print "using '**' cost: " + str(t_end_2 - t_start_2) + "seconds"
输出:
using '<<' cost: 0:00:00.327000 seconds
using '**' cost: 0:00:04.990000 seconds