python - 如何保存具有多个参数的冗长计算结果?
问题描述
我正在使用多个参数进行一些冗长的计算。我想保存和检索这些计算的结果。我知道如何用 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'
推荐阅读
- android - Android Kotlin DSL - 未解决的参考:firebaseAppDistribution
- laravel - Laravel Rule::unique 没有按预期工作
- nginx - nginx入口控制器转发源ip
- android - 使用kotlin协程中的房间从服务器获取数据后如何将数据保存到数据库?
- python - 使用 python 3 将“Step x) Get value”替换为“Step x. Get value”,其中 x 是整数值
- c# - 如何拦截错误并更改 libvlcsharp xamarin 表单的样式
- c++ - 迭代元组类型
- javascript - 未从 Javascript 数组中删除的对象
- c# - SFTP 进程输出重定向无法正常工作
- javascript - 允许在字符串中的 ':' 之后使用 0 到 59 的整数