python - 这是否作为(std)模块 : cyclic iteration (a little like itertools. 周期存在)而没有中间内存分配

标签 python

嗨,我想要一个迭代器,它可以循环重复一个序列。

我倾向于使用 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/

相关文章:

python - 将实体嵌入映射回原始分类值

python - 使用 pandas 和 bs4 从网页获取信息并写入 .xls 文件

python - 使用变量将选项传递给 Tkinter 小部件

python - 从Python中的绘图中检索数据?

python - 为什么我的 Django 迁移会加载我的 urls.py?

python - 在 Python 中对几个列表中的每个元素求和

python - 标签传播 - 数组太大

python - Pandas 在枢轴后调整数据框大小?

python - 将迭代器分配给 Python 切片

python - 转换列表的格式