我有生成許多 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,'%')
uj5u.com熱心網友回復:
你可以自己測量時間!
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 指出的那樣,這并不理想,因為我們仍然需要等到一個回圈周期完成可能會持續很長時間的事情,但在您的情況下,它應該可以按預期作業。
uj5u.com熱心網友回復:
我會使用這樣的東西:
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
這個想法是產生一個單獨的行程并等待一定的時間。如果該程序未完成,您可以終止它并繼續下一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/405895.html
標籤:
上一篇:希望遍歷跳過特定索引的串列串列
