Python 这是否作为(std)模块存在:循环迭代(有点像itertools.cycle),而不需要中间内存分配
嗨,我想要一个迭代器,循环地重复一个序列 我倾向于使用循环计数v3,但我想知道我是否忽略了现有python模块中的某些内容 下面是三个实现。到目前为止,我还没有对它们进行分析,但我会本能地选择解决方案3,或者如果我把它放进我会选择的图书馆 最后一个实现 让我们假设N可能是一个巨大的数字,我希望使用尽可能少的RAM 我的问题是,我是否正在重新发明轮子,而这种功能在其他地方已经存在Python 这是否作为(std)模块存在:循环迭代(有点像itertools.cycle),而不需要中间内存分配,python,Python,嗨,我想要一个迭代器,循环地重复一个序列 我倾向于使用循环计数v3,但我想知道我是否忽略了现有python模块中的某些内容 下面是三个实现。到目前为止,我还没有对它们进行分析,但我会本能地选择解决方案3,或者如果我把它放进我会选择的图书馆 最后一个实现 让我们假设N可能是一个巨大的数字,我希望使用尽可能少的RAM 我的问题是,我是否正在重新发明轮子,而这种功能在其他地方已经存在 import itertools def cyclic_count_v1(N): # advantage:
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循环(N):
x=0
尽管如此:
x=(x+1)%N
产量x
对于周期(10)中的值:。。。
这比第一个版本稍微经济一些,因为
itertools.count
将存储一个不断增加的整数,而这个版本存储一个介于0和N之间的整数。我很困惑。你会问这样的东西是否已经存在,然后你会向我们展示相同东西的4种不同实现。为什么回答“是/否”问题需要这样做?您想让我们也检查一下您的4个潜在解决方案吗?@chepneritertools.cycle
将所有元素内部存储在某种容器中,有效地使输入的副本可编辑。@Aran Fey对我的问题不清楚表示歉意。我想我说过,我想知道这样的东西是否已经存在。我重新措辞了这个问题。我愿意接受任何建议,进一步重新措辞。我想如果我不展示这三种实现并提及其优缺点,人们可能会把我引向itertools。cycle@Aran-Fey我还认为,如果现有模块中不存在这一点,那么人们可能会找到至少一个解决此类问题的潜在解决方案这只是V1,但是重新实现itertools.count
@chepner:现在我想,它并不完全等同,它可能会为大量数字节省一些空间。比较sys.getsizeof(1)
和sys.getsizeof(100\000\000\000\000)
@blue\u note hmm如果没有人知道我建议的内置解决方案,如果您只是在答案的开头添加,您不知道任何内置解决方案/库,并且您建议您的解决方案,那么我会将您的答案标记为已接受solution@chepner:我想,较大数字的模会稍微慢一点。很难相信timeit有这么短的功能,但对我来说,有20-25%的差异