我对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
答案 0 :(得分:2)
它不会产生明显的差异,大部分时间都花在循环内部,而不是生成range
对象。
range
返回一个序列,这意味着它将动态生成值,而不必将它们存储在列表中。
答案 1 :(得分:2)
在python 3中,range
是一个生成器。这意味着它将产生序列的所有数字。这是简单的补充。
您可以将其缓存在list
:cache = list(range(10))
中,但会分配一些内存并需要对其进行迭代:效率不高!
BTW:第一个例子没有缓存结果,你只需要复制生成器函数。你可以节省几微秒的解析时间(因为该函数已被解析,不值得)
所以,不,在python 3中缓存range
的结果没有用(在python 2中,它会很有用,是的,因为它会创建一个实际的list
)。