优化Python中的列表创建

时间:2016-03-29 00:28:08

标签: python list python-2.7 optimization

我正在使用

创建一个列表
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秒才能在我的系统上运行。

2 个答案:

答案 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