itertools.repeat VS itertools.cycle

时间:2016-04-19 06:13:49

标签: python python-2.7 itertools

itertools.repeat(n)itertools.cycle(n)之间有什么区别吗?看起来,它们产生相同的输出。在我需要某个元素的无限循环的情况下,使用它会更有效吗?

5 个答案:

答案 0 :(得分:6)

简单地说,itertools.repeat将重复给定的参数,itertools.cycle将循环给定的参数。不要运行此代码,但例如:

from itertools import repeat, cycle

for i in repeat('abcd'): print(i)
# abcd, abcd, abcd, abcd, ...

for i in cycle('abcd'): print(i)
# a, b, c, d, a, b, c, d, ...

答案 1 :(得分:5)

这些是等效的,但第一个更清晰,更快一点:

it = repeat(x)
it = cycle([x])

但是, cycle 可以选择重复整个序列:

it = cycle(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])

重复可以选择设置重复次数限制:

it = repeat(x, 5)         # Return five repetitions of x

此外,预期的用例也不同。

特别是, repeat 旨在为映射函数提供重复参数:

it = imap(pow, repeat(2), range(10))

周期用于循环重复行为。这是一个返回1/1 - 1/3 + 1/5 - 1/7 + 1/9 + ...的Python 3示例:

it = accumulate(map(operator.truediv, cycle([1, -1]), count(1, 2)))

后一个例子展示了如何将所有部分组合在一起创建一个"迭代器代数"。

希望你发现这很有启发性: - )

答案 2 :(得分:2)

itertools.cycle()使用迭代器。例如,你不能做itertools.cycle(5) - 这会引发错误:

>>> itertools.cycle(3)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

itertools.repeat()会一遍又一遍地重复相同的元素 - 旨在迭代迭代器的元素。一遍又一遍地返回同一个对象非常好

换句话说,做itertools.repeat([1,2,3], 5)会:

>>>>[i for i in itertools.repeat([1,2,3], 5)]
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

在执行itertools.cycle([1,2,3])时会返回一个看起来像[1,2,3,1,2,3,1,2,3,...]的无限列表(或者如果你能以某种方式将其放入内存中,它会最少)。

差异相当深远。

答案 3 :(得分:1)

请参阅itertools文档以了解其中的差异。

>>> import itertools
>>> help(itertools.repeat)
Help on class repeat in module itertools:

class repeat(__builtin__.object)
 |  repeat(object [,times]) -> create an iterator which returns the object
 |  for the specified number of times.  If not specified, returns the object
 |  endlessly.
 |
...
...

>>> help(itertools.cycle)
Help on class cycle in module itertools:

class cycle(__builtin__.object)
 |  cycle(iterable) --> cycle object
 |
 |  Return elements from the iterable until it is exhausted.
 |  Then repeat the sequence indefinitely.
 |

答案 4 :(得分:0)

itertools.repeat 一遍又一遍地返回同一个对象,itertools.cycle 一遍又一遍地遍历同一个对象。所以:

import itertools

# Warning: infinite loop ahead
for x in itertools.repeat([1, 2, 3]):
    print(x)
    # [1, 2, 3], [1, 2, 3], ...

for x in itertools.cycle([1, 2, 3]):
    print(x)
    # 1, 2, 3, 1, 2, 3, ...

因此,如果您想要的是多次返回一个对象的东西,请使用itertools.repeat;如果它是循环在某个不同对象上的东西,则使用itertools.cycle