如何保存多个参数的冗长计算结果?
How to save results of lenghty calculation with multiple parameters?
我正在使用多个参数进行一些冗长的计算。我想保存和检索这些计算的结果。我知道如何用 pickle 保存 numpy 数组,但我不确定如何有效地编码用于计算这些数组的参数。
例如,我有一个计算大矩阵特征值的函数。根据用于构造矩阵的参数,我得到不同的特征值。现在我想保存我用 dim, parameterA, parameterB, parameterC
的特定组合得到的特征值。我可以尝试对文件名中的参数进行编码,但这很快会导致文件名非常长,因为我的实际代码中有更多参数。关于如何解决这个问题的任何想法?
import numpy
def calculate_eigenvalues(dim, parameterA, parameterB, parameterC):
numpy.random.seed(parameterA)
matrix = numpy.random.uniform(parameterB, parameterC, (dim,dim))
eigenvalues = numpy.linalg.eigvals(matrix)
return eigenvalues
def magic_save(dim, parameterA, parameterB, parameterC):
eigenvalues = calculate_eigenvalues(dim, parameterA, parameterB, parameterC)
SAVE(eigenvalues)
def magic_load(dim, parameterA, parameterB, parameterC):
LOAD(eigenvalues)
return eigenvalues
# calculate and save eigenvalues
magic_save(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1) # calculates and saves eigenvalues
# calculate and save some other eigenvalues for different parameters
magic_save(dim=8, parameterA=23, parameterB=-3.1, parameterC=0.1) # calculates and saves eigenvalues
# retrieve eigenvalues for a certain combination of parameters
loaded_eigenvalues = magic_load(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1) # loads saved eigenvalues
calculated_eigenvalues = calculate_eigenvalues(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1)
# compare that the result is really the same:
print(f"loaded and calculated eigenvalues are identical:"
f"{numpy.allclose(loaded_eigenvalues, calculated_eigenvalues)}")
IIUC,您可以根据所有参数值(可能包括参数名称)计算哈希值,并将其用作文件名。这样您就可以相当确定为每个参数值组合获得唯一的文件名,同时保持文件名长度简洁一致。
from hashlib import md5
def get_filename(*params):
fn = md5('_'.join(map(str, params)).encode('utf-8')).hexdigest()[:10]
return fn + '.pickle'
params = [1.2, 3, 4, 'abc']
get_filename(params)
# out: '4d2e889a15.pickle'
我正在使用多个参数进行一些冗长的计算。我想保存和检索这些计算的结果。我知道如何用 pickle 保存 numpy 数组,但我不确定如何有效地编码用于计算这些数组的参数。
例如,我有一个计算大矩阵特征值的函数。根据用于构造矩阵的参数,我得到不同的特征值。现在我想保存我用 dim, parameterA, parameterB, parameterC
的特定组合得到的特征值。我可以尝试对文件名中的参数进行编码,但这很快会导致文件名非常长,因为我的实际代码中有更多参数。关于如何解决这个问题的任何想法?
import numpy
def calculate_eigenvalues(dim, parameterA, parameterB, parameterC):
numpy.random.seed(parameterA)
matrix = numpy.random.uniform(parameterB, parameterC, (dim,dim))
eigenvalues = numpy.linalg.eigvals(matrix)
return eigenvalues
def magic_save(dim, parameterA, parameterB, parameterC):
eigenvalues = calculate_eigenvalues(dim, parameterA, parameterB, parameterC)
SAVE(eigenvalues)
def magic_load(dim, parameterA, parameterB, parameterC):
LOAD(eigenvalues)
return eigenvalues
# calculate and save eigenvalues
magic_save(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1) # calculates and saves eigenvalues
# calculate and save some other eigenvalues for different parameters
magic_save(dim=8, parameterA=23, parameterB=-3.1, parameterC=0.1) # calculates and saves eigenvalues
# retrieve eigenvalues for a certain combination of parameters
loaded_eigenvalues = magic_load(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1) # loads saved eigenvalues
calculated_eigenvalues = calculate_eigenvalues(dim=4, parameterA=2, parameterB=-3.2, parameterC=4.1)
# compare that the result is really the same:
print(f"loaded and calculated eigenvalues are identical:"
f"{numpy.allclose(loaded_eigenvalues, calculated_eigenvalues)}")
IIUC,您可以根据所有参数值(可能包括参数名称)计算哈希值,并将其用作文件名。这样您就可以相当确定为每个参数值组合获得唯一的文件名,同时保持文件名长度简洁一致。
from hashlib import md5
def get_filename(*params):
fn = md5('_'.join(map(str, params)).encode('utf-8')).hexdigest()[:10]
return fn + '.pickle'
params = [1.2, 3, 4, 'abc']
get_filename(params)
# out: '4d2e889a15.pickle'