Python 发电机外部的发电机控制(networkx简单循环)

Python 发电机外部的发电机控制(networkx简单循环),python,loops,iterator,generator,networkx,Python,Loops,Iterator,Generator,Networkx,我使用NetworkX的simple_cycles生成所有循环,如果发现大小为k的循环(k由用户提供),我将在中断的条件下进行迭代 根据图表的不同,简单的_循环基本上需要很长时间才能找到大小为k的循环。我想在一段时间后停止检查。我不能根据发现的周期数量停止,因为这是不可靠的。有时,一整分钟内可能会出现一个循环,30秒内可能会出现100000个循环 我的问题是,是否有一种方法可以根据经过的一定时间从发电机外部停止发电机。。或者如果唯一的方法是修改生成器本身的代码 (对于我正在尝试做的事情,任何一般

我使用NetworkX的simple_cycles生成所有循环,如果发现大小为k的循环(k由用户提供),我将在中断的条件下进行迭代

根据图表的不同,简单的_循环基本上需要很长时间才能找到大小为k的循环。我想在一段时间后停止检查。我不能根据发现的周期数量停止,因为这是不可靠的。有时,一整分钟内可能会出现一个循环,30秒内可能会出现100000个循环

我的问题是,是否有一种方法可以根据经过的一定时间从发电机外部停止发电机。。或者如果唯一的方法是修改生成器本身的代码


(对于我正在尝试做的事情,任何一般性的建议都将不胜感激。)

问题是,有一些病态的角落案例。。。例如,一个巨大的、有零个循环的巨大图形,以至于在第一次迭代
nx之前需要太多时间。简单的循环(G)
可以完成

因此,除非您将执行放在另一个可以终止的上下文中(例如从
多处理
中分离出的
进程
),否则无法从生成器外部执行

然后,对于异步获得的每个循环(从进程或线程),可以检查长度条件和总运行时间的条件,如果超过时间限制,则选择终止另一个进程/线程

另一方面,如果您不关心这种类型的角点情况,并且您合理地确定
nx.simple_cycles(G)
生成的值将在合理的时间内返回,那么您可以包装该生成器以制作您自己的限时生成器:

import time


def time_limited_cycles(G, time_limit=100.0):
    elapsed, cycle_generator = 0.0, nx.simple_cycles(G)
    while elapsed <= time_limit:
        start_time = time.time()
        try:
            # crucial assumption here, that calling next on
            # the original generator never takes too long.
            cycle = next(cycle_generator)
        except StopIteration:
            break
        yield cycle
        elapsed += time.time() - start_time 
        # move elapsed above the yield line if you are looking
        # to limit the internal runtime of the generator, rather
        # than overall time spent processing cycles.
导入时间
def时间限制循环(G,时间限制=100.0):
经过,周期发生器=0.0,nx。简单周期(G)

经过后,检查长度的部分看起来是一个很好的起点。使用
时间
对计时也是一个好主意。在代码顶部插入:

from time import time
在循环的
之前,插入:

time_to_wait = int (time()) + x # x is the time you want to wait. 
for
循环中,将
if
语句更改为:

if len (cycle) == k or int (time()) == time_to_wait
您可能希望创建另一个
if
,而不是合并它,因为超时仍将
checkval
设置为True,而您可能不希望这样。在这种情况下,只需保留第一个
if
,然后制作另一个:

if int (time()) == time_to_wait: break
if int (time()) == time_to_wait: break