【问题标题】:Skip step in while loop subject to time constraint受时间限制在while循环中跳过步骤
【发布时间】:2022-01-07 20:11:04
【问题描述】:

我有生成许多 N 个序列并存储它们的代码。如果我将runs 设为大,则循环可能会卡在代码的while N[j] > 0: 部分。在 while 循环中包含跳过某个步骤的最佳方法是什么,例如循环中该步骤中的时间是否超过几秒钟并移至下一个步骤?

runs = 20
Lloc = 1
n0 = 1
#Empty list to store N series
N_array = []
#Empty list to store z series
z_array = []
for r in range(0,runs):
        #Set initial z series values to be zero
        z = [0]
        #Set initial jump process values to be n0
        N = [n0]
        #Set iteration to be zero
        j = 0
        #While
        while N[j] > 0:
            z.append(z[j] + np.random.exponential(Lloc/(2*N[j]**2))) 
            #Pick jump at position j+1 to be N[j] -1 or +1 with prob 1/2
            N.append(N[j] + np.random.choice([-1,1]))
            #Update iteration
            j = j+1
        #Store N,z realisation if sum dz < 10 say
        if sum(np.diff(z)) < 10:
            N_array.append(N)
            z_array.append(z)

        #Completion
        print((r+1)/runs*100,'%')

【问题讨论】:

    标签: python loops time while-loop


    【解决方案1】:

    你可以自己测量时间!

    from time import perf_counter
           #While
            start = perf_counter()
            while N[j] > 0:
                z.append(z[j] + np.random.exponential(Lloc/(2*N[j]**2))) 
                #Pick jump at position j+1 to be N[j] -1 or +1 with prob 1/2
                N.append(N[j] + np.random.choice([-1,1]))
                #Update iteration
                j = j+1
                if perf_counter() - start > TIMEOUT:
                    break
    

    甚至为此使用上下文:

    class Timer:
        def __enter__(self):
            self.start = perf_counter()
            return self
    
        @property
        def elapsed(self):
            return perf_counter() - self.start
    
        def __exit__(self, exc_type, exc_value, exc_traceback):
            pass
    
    with Timer() as t:
        while True:
            if t.elapsed > TIMEOUT:
                break
    

    正如 image357 指出的那样,这并不理想,因为我们仍然需要等到一个循环周期结束才能持续很长时间,但在您的情况下,它应该可以按预期工作。

    【讨论】:

    • 好答案。但是有一个限制:这假设每个循环体都是可测量的,即在比TIMEOUT 短得多的时间内完成。
    • 谢谢,已将其添加到答案中!
    • 谢谢@kosciej16 我得到错误名称'self' is not defined 然而
    • 编辑答案,它只是开始,而不是第一个示例中的 self.start
    • 非常感谢,感谢您的教育! @kosciej16
    【解决方案2】:

    我会使用这样的东西:

    import time
    import multiprocessing as mp
    
    def loop_body(i):
        print(f"sleeping for {i} seconds")
        time.sleep(i)
        print(f"sleep of {i} seconds done")
    
    
    max_wait_time = 2.1
    i = 1
    while i < 4:
        proc = mp.Process(target=loop_body, args=(i,))
        proc.start()
        proc.join(max_wait_time)
        proc.terminate()
        i += 1
    

    这个想法是产生一个单独的进程并等待一定的时间。如果该过程未完成,您可以终止它并继续下一步。

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2013-11-12
      • 2020-03-11
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多