【问题标题】:Should I cache range results if I reuse them?如果我重用它们,我应该缓存范围结果吗?
【发布时间】:2017-03-10 17:56:01
【问题描述】:

我对 python 比较陌生,我正在尝试针对 HackerRank 问题优化一些代码。我发现使用 range(即生成列表?)比使用带有单个变量的 while 循环进行迭代更快。

我想知道如果稍后在代码中迭代相同的序列,缓存range 函数的结果是否更快。例如:


这样更快吗:

ten = 10
zeroToTen = range(ten)

sum = 0
for x in zeroToTen:
    sum += x

product = 1
for y in zeroToTen:
    product *= y

或者我应该每次都回想一下range

ten = 10

sum = 0
for x in range(10):
    sum += x

product = 1
for y in range(10):
    product *= y

【问题讨论】:

    标签: python python-3.x optimization range


    【解决方案1】:

    这不会产生明显的差异,大部分时间都花在循环内部,而不是生成 range 对象。

    Python 3 中的range 返回一个序列,这意味着它将即时生成值,而无需将它们存储在列表中。

    【讨论】:

      【解决方案2】:

      在 python 3 中,range 是一个生成器。这意味着它将产生序列的所有数字。这是简单的添加。

      您可以将其缓存在 list:cache = list(range(10)) 中,但这会分配一些内存并且需要对其进行迭代:效率不高!

      顺便说一句:第一个示例不缓存结果,您只需复制生成器函数。你可能会节省几微秒的解析时间(因为函数已经被解析了,不值得)

      所以,不,在 python 3 中缓存 range 的结果是没有用的(在 python 2 中,它会很有用,是的,因为它创建了一个实际的 list)。

      【讨论】:

      • range 返回一个序列,可以多次使用:r = range(5); print(list(r), list(r))
      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多