Python 如何正确存储循环迭代的中间结果?
我嵌套了for循环和一个在最内层循环的每次迭代中执行的计算开销很大的函数。函数的返回值是一个浮点数,它被写入多维numpy数组中。由于脚本的计算时间很长,我希望在每次输入新值时缓存numpy数组的状态,以防服务器同时崩溃。如果脚本的执行在中期中止,则在下次调用时,应自动加载缓存的numpy数组,并在正确的位置输入缺少的值 下面的代码就是这样做的。有人对如何编写这个elganter/shorter/simpler有什么建议吗Python 如何正确存储循环迭代的中间结果?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我嵌套了for循环和一个在最内层循环的每次迭代中执行的计算开销很大的函数。函数的返回值是一个浮点数,它被写入多维numpy数组中。由于脚本的计算时间很长,我希望在每次输入新值时缓存numpy数组的状态,以防服务器同时崩溃。如果脚本的执行在中期中止,则在下次调用时,应自动加载缓存的numpy数组,并在正确的位置输入缺少的值 下面的代码就是这样做的。有人对如何编写这个elganter/shorter/simpler有什么建议吗 import numpy as np import time impor
import numpy as np
import time
import random
import os
import pickle
def computationally_expensive_task():
time.sleep(0.25)
return random.randint(0, 100)
def is_file(file_dir, file_name):
path = os.path.join(file_dir, file_name)
return os.path.isfile(path)
def load_file(file_dir, file_name):
path = os.path.join(file_dir, file_name)
with open(path, 'rb') as file:
return pickle.load(file)
def load_files_from_dir(file_dir, file_names):
files = []
for file_name in file_names:
files.append(load_file(file_dir, file_name))
return files
def remove_file(file_dir, file_name, verbose=0):
path = os.path.join(file_dir, file_name)
os.remove(path)
if verbose==1:
print('{} has been removed from {}'.format(file_name, file_dir))
def remove_files_from_dir(file_dir, file_names, verbose=0):
for file_name in file_names:
remove_file(file_dir, file_name, verbose=verbose)
def save_var(var, file_dir, file_name):
path = os.path.join(file_dir, file_name)
with open(path, 'wb') as file:
pickle.dump(var, file)
def save_vars(vars, file_dir, file_names):
for var, file_name in zip(vars, file_names):
save_var(var, file_dir, file_name)
#-----------------------------------------------------------
file_dir = r'example_dir'
file_name = 'example_file'
cache_var_names = ['start_idc', 'cached_var']
n_outer_iterations = 5
n_inner_iterations = 5
if is_file(file_dir, cache_var_names[0]): # check if script was aborted midtime at last call
start_idc, cached_var = load_files_from_dir(file_dir, cache_var_names)
else:
start_idc = {'i_outer': 0,
'i_inner': 0}
cached_var = np.zeros((n_outer_iterations, n_inner_iterations))
for i_outer in range(start_idc['i_outer'], n_outer_iterations):
for i_inner in range(start_idc['i_inner'], n_inner_iterations):
cached_var[i_outer, i_inner] = computationally_expensive_task()
start_idc['i_inner'] += 1
save_vars([start_idc, cached_var], file_dir, cache_var_names)
start_idc['i_inner'] = 0
start_idc['i_outer'] += 1
results = cached_var
save_var(results, file_dir, file_name)
remove_files_from_dir(file_dir, cache_var_names)
好吧,你可以做一件事来缩短它,那就是从代码中删除
pass
es。完成;)请考虑是否有参数传递到