【问题标题】:Getting a hash of a function that is stable across runs获取跨运行稳定的函数的散列
【发布时间】:2019-09-18 13:27:51
【问题描述】:

IIUC python 函数哈希(例如用作dict 中的键)在运行期间不稳定。

可以使用诸如 dill 或其他库之类的东西来获取跨运行和不同计算机稳定的函数的哈希值吗? (id当然不稳定)。

【问题讨论】:

标签: python hash dill


【解决方案1】:

我是dill 作者。我编写了一个名为klepto 的包,它是一种分层缓存/数据库抽象,可用于本地内存散列和跨并行/分布式资源的对象共享。它包括几个用于构建函数 ID 的选项。

请参阅klepto.keymapsklepto.crypto 了解散列选择——有些可以跨并行/分布式资源工作,有些则不能。其中一种选择是使用dill 或其他方式进行序列化。

klepto 类似于joblib,但专门设计用于在单个 python 会话之外具有对象持久性和共享。 dask中可能有类似klepto的东西。

【讨论】:

  • 您好,谢谢您的回答。您能否详细说明这是否允许不仅仅是签名散列,即具有相同签名的不同静态函数是否获得不同的散列,如果是这样,它是如何工作的?是基于静态分析吗?实际上,我正在寻找获得Callable 并返回Text 的东西,其中Callable 可以是functools.partialtoolz.curry'd 函数或只是一个静态函数。
  • 目的是您使用存档。 klepto.archive 的接口是一个带有一些扩展的字典。您可以根据需要生成密钥,并将函数存储为值。选择的keymap 将用户选择的密钥转换为存储在存档中的密钥。因此,如果您选择klepto.keymaps.picklemap,理论上您可以将可调用对象作为键和值传递......它会将序列化对象存储为键,并且(可能)将序列化对象存储为值。值的保存方式与您选择的存档类型有关(例如 HDF、picklefile、SQL 等)。
【解决方案2】:

正如您所提到的,id 在不同的进程之间几乎永远不会相同,尽管在不同的机器上肯定是相同的。根据docs

id(对象): 返回对象的“身份”。这是一个整数,它是 保证在此对象期间是唯一且恒定的 寿命。具有非重叠生命周期的两个对象可能具有相同的生命周期 id() 值。

这意味着id 应该不同,因为脚本的每个实例创建的对象驻留在内存中的不同位置并且不是同一个对象。 id 定义了身份,它不是代码块的校验和。

唯一在执行的脚本的不同实例上保持一致的是函数的名称。

另一种方法是计算实际文本的校验和,从而确定性地识别脚本中的代码块。但是控制方法的内容应该由 git 之类的版本控制系统来处理。如果您需要计算您的代码或其中一部分的哈希和,您可能正在做一些次优的事情。

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2018-12-07
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多