Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这是否作为(std)模块存在:循环迭代(有点像itertools.cycle),而不需要中间内存分配_Python - Fatal编程技术网

Python 这是否作为(std)模块存在:循环迭代(有点像itertools.cycle),而不需要中间内存分配

Python 这是否作为(std)模块存在:循环迭代(有点像itertools.cycle),而不需要中间内存分配,python,Python,嗨,我想要一个迭代器,循环地重复一个序列 我倾向于使用循环计数v3,但我想知道我是否忽略了现有python模块中的某些内容 下面是三个实现。到目前为止,我还没有对它们进行分析,但我会本能地选择解决方案3,或者如果我把它放进我会选择的图书馆 最后一个实现 让我们假设N可能是一个巨大的数字,我希望使用尽可能少的RAM 我的问题是,我是否正在重新发明轮子,而这种功能在其他地方已经存在 import itertools def cyclic_count_v1(N): # advantage:

嗨,我想要一个迭代器,循环地重复一个序列

我倾向于使用循环计数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循环(N):
x=0
尽管如此:
x=(x+1)%N
产量x
对于周期(10)中的值:。。。

这比第一个版本稍微经济一些,因为
itertools.count
将存储一个不断增加的整数,而这个版本存储一个介于0和N之间的整数。

我很困惑。你会问这样的东西是否已经存在,然后你会向我们展示相同东西的4种不同实现。为什么回答“是/否”问题需要这样做?您想让我们也检查一下您的4个潜在解决方案吗?@chepner
itertools.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%的差异