【问题标题】:Optimising list creation in Python在 Python 中优化列表创建
【发布时间】:2016-03-29 10:02:28
【问题描述】:

我正在使用创建列表

sum_range=list(2**x for x in range(start_range,end_range+1))

这里 start_range 和 end_range 取从 0 到大约 400 万的较大值。

这行代码似乎是瓶颈。 最终我想要列表 sum_range 中所有数字的总和。可能有更好的方法来做到这一点?

所需时间:-

start_range=188640 end_range=197280

代码在我的系统上运行大约需要 6 秒。

【问题讨论】:

  • 如果您使用的是 Python 2,请使用 xrange,它使用惰性求值。
  • @idjaw:考虑到2**x 的巨大程度,NumPy 帮不上忙。
  • 您要生成 2^4000000?仅运行 2**(4 * 10**6) 就足以让我的 Python 提示符冻结 30 秒,你确定这是你需要做的吗?
  • @idjaw 我只是尝试使用 xrange,并没有进行太多优化。我认为这与大数字有关。
  • 2**k 从 0 到 n 的总和等于 2**(n+1)-1。

标签: python list python-2.7 optimization


【解决方案1】:

2**n 的总和是代数已知的。对于 n=0 到 m,它是:2**(m+1)-1。 因此,如果您想从 a 到 b(包括)了解它,请使用 2**(b+1) - 2**(a+1) + 2**a。查找一般情况的几何级数。

【讨论】:

  • 抱歉,没有看到 Serge 的评论。
【解决方案2】:

尝试使用"<<"操作符代替"**",也可以大大节省从4.0~5.0 seconds0.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

【讨论】:

  • 很好的解决方案。我已经结合了公式和您的解决方案。使用过去的公式进行 1000 次迭代需要 30 秒。使用公式进行 1000 次迭代,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2018-08-01
相关资源
最近更新 更多