嗨,我想要一个迭代器,它可以循环重复一个序列。
我倾向于使用 cyclo_count_v3,但想知道我是否忽略了现有 python 模块中的某些内容。
下面三个实现。到目前为止,我还没有对它们进行分析,但会本能地选择解决方案3,或者如果我将其放入我会选择的库中 最后的实现。
假设 N 可能是一个很大的数字,并且我想使用尽可能少的 RAM。
我的问题是,我是否在重新发明轮子,并且此功能已经存在于其他地方。
import itertools
def cyclic_count_v1(N):
# advantage: low memory
# disadvantage: calculates modulo for each iteration
# and as pointed out by @chepner.
# counter is growing infinitely
for v in itertools.count():
yield v % N
def cyclic_count_v2(N):
# advantage: no modulo calculation
# disadvantage: a copy of expanded range(N) is created
return itertools.cycle(range(N))
def cyclic_count_v3(N):
# advantage no modulo calculation
# advantage no copy of range in RAM
while True:
for v in range(N):
yield v
最后但并非最不重要的另一个(更通用的)实现,具有不同的签名:
def cyclic_loop(iterfactory):
while True:
myiter = iterfactory()
for v in myiter:
yield v
它必须通过以下方式调用:
for v in cyclic_loop(lambda: range(N)):
print(v)
最佳答案
你可以制作一个发电机
def cyclical(N):
x = 0
while True:
x = (x + 1) % N
yield x
for value in cyclical(10):...
这比第一个版本稍微经济一些,因为 itertools.count
将存储一个不断增加的整数,而这个版本存储一个 0 到 N 之间的整数。
关于python - 这是否作为(std)模块 : cyclic iteration (a little like itertools. 周期存在)而没有中间内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58169638/