Python 如何正确存储循环迭代的中间结果?

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

我嵌套了for循环和一个在最内层循环的每次迭代中执行的计算开销很大的函数。函数的返回值是一个浮点数,它被写入多维numpy数组中。由于脚本的计算时间很长,我希望在每次输入新值时缓存numpy数组的状态,以防服务器同时崩溃。如果脚本的执行在中期中止,则在下次调用时,应自动加载缓存的numpy数组,并在正确的位置输入缺少的值

下面的代码就是这样做的。有人对如何编写这个elganter/shorter/simpler有什么建议吗

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。完成;)请考虑是否有参数传递到 >计算开销>任务/>代码,或者是纯随机的?参数被传递。参数值会更改循环的每个周期。