问题标签 [dill]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
420 浏览

python - Pathos 多处理 pool.map 不尊重递归 = True

当我尝试在 sympy.lambdify 的lambdified 函数上使用 pool.map 时,莳萝会抛出一个错误:

我在尝试使用 dill.dump 转储对象时也遇到了此错误,但可以通过dill.settings['recurse'] = True. 但是,导入dill和设置标志似乎对 pool.map() 没有影响:

此外,我希望能够并行化函数的实际 sy.lambdify 创建:

这也失败了,出现了类似的错误。

我找到了第一种情况的解决方法:我只是将函数调用包装到一个非 sympy 的:

但这在第二种情况下没有帮助(并行化lambdify)。有没有办法强制pathos兑现dill.settings

0 投票
0 回答
407 浏览

python - Python Dill/Pickle - 无模块

好吧,伙计们,

这是我正在努力解决的问题。

  1. 我有一个团队使用 tensorflow 制作机器学习模型;他们不知道也不关心我们的网站。

  2. 我有一个网络团队,负责获取 ML 团队的输出并将其作为 api 进行操作。他们只需要接受一些随机文件并使其工作。

所以我们决定尝试对模型类进行酸洗(或挖掘),然后加载它们并将可变权重恢复到它们中;太好了,这很有效。

不起作用的是,当我们将模型定义类发送到服务器并尝试使用 dill 或 pickle 加载它时,我们会收到以下错误:

文件“/usr/local/lib/python3.5/dist-packages/dill/dill.py”,第 423 行,在 find_class 返回 StockUnpickler.find_class(self, module, name) ImportError: No module named 'RANDOM_MODEL_CLASS_NAME'

这告诉我泡菜/莳萝由于某种原因需要类在加载时所在的位置或可访问的位置;这首先对我们来说破坏了酸洗/挖掘它的全部目的。

关于如何让它发挥作用的任何见解?我试过 pkl.dump 和转储。

感谢您的任何见解!

0 投票
0 回答
354 浏览

python - 腌制一个动态导入的类

我有一堆从导入的类创建的对象

我需要腌制。只要packagePath直接在 Python 路径或工作目录中,这一切都可以完美运行。

但是一旦我把它移到别的地方,我就害怕了

我尝试添加一个__reduce__将类作为第一个值返回的方法。我尝试使用dill,据说它能够序列化完整的类,而不是对类的简单引用(我尝试将它与 结合使用__reduce__)。

它目前的工作方式是通过在负责导入包的对象中将它们与包路径一起双重腌制:

我发现这种方式真的很复杂,我想知道:有没有更蟒蛇的方式来实现这一点?

注意:所有这些都发生在 Python 2.7.10、dill 0.2.6 中。所有要序列化的对象都是新型对象(继承自object)。

0 投票
2 回答
2553 浏览

python - 为什么 dill 比用于 numpy 数组的 pickle 更快且磁盘效率更高

我在 Ubuntu 16.04 上使用 Python 2.7 和 NumPy 1.11.2,以及最新版本的 dill(我刚刚做了pip install dill)。

使用 pickle 存储 NumPy 数组时,我发现 pickle 非常慢,并且以几乎三倍于“必要”大小的方式存储数组。

例如,在以下代码中,pickle 大约慢了 50 倍(1 秒对 50 秒),并创建了一个 2.2GB 而不是 800MB 的文件。

我以为莳萝只是泡菜的包装。如果这是真的,有没有办法可以自己提高泡菜的性能?通常不建议对 NumPy 数组使用 pickle 吗?

编辑:使用 Python3,我得到相同的pickle性能dill

PS:我知道numpy.save,但我正在一个框架中工作,我将许多不同的对象(全部位于字典中)存储到文件中。

0 投票
1 回答
920 浏览

python - 如果 __hash__ 被覆盖,Pickle/dill 无法处理循环引用

考虑以下 MWE:

上面的示例失败,但出现以下异常:

B.links据我了解这个问题,pickle 在反序列化之前尝试反序列化Aset用于B尝试在某个点调用的A.__hash__实例,并且由于实例A尚未完全构造,它无法计算自己的哈希,这让每个人都感到难过。

如何在不破坏循环引用的情况下解决这个问题?(打破循环将是很多工作,因为我试图序列化的对象非常复杂)

0 投票
1 回答
1350 浏览

python - 不同模块中的酸洗和解酸

我知道许多其他问题已经涵盖了这一点(无法使用pickle和multipile模块加载文件),但我看不出他们的解决方案如何适用于我的情况。

这是我的项目结构(尽可能少):

classify-updater/main.py

classify-updater/updater/updater.py

classify/main.py

这导致ImportError.

在其他地方已经解释过,pickle 需要类定义来加载对象,但是我看不到对更新程序模块的引用来自哪里,因为我只是在腌制 Vectorizer 的一个实例。

我已经大大简化了这个例子。就我们的代码库而言,这两个包相距甚远。将一个模块导入另一个模块可能不可行。有没有办法解决这个问题?

0 投票
2 回答
1353 浏览

python - 用 pickle 或 dill 序列化 __main__ 中的对象

我有酸洗问题。我想在我的主脚本中序列化一个函数,然后加载它并在另一个脚本中运行它。为了证明这一点,我制作了 2 个脚本:

尝试1:天真的方式:

dill_pickle_script_1.py

dill_pickle_script_2.py

问题:当我运行脚本 2 时,我得到AttributeError: 'module' object has no attribute 'my_func'. 我明白为什么:因为当my_func在script1中序列化时,它属于__main__模块。dill_pickle_script_2 不知道__main__那里引用了 dill_pickle_script_1 的命名空间,因此找不到引用。

尝试 2:插入绝对导入

我通过添加一个小技巧解决了这个问题 - 在腌制之前,我在 dill_pickle_script_1 中向 my_func 添加了一个绝对导入。

dill_pickle_script_1.py

现在它起作用了!但是,我想避免每次我想这样做时都必须这样做。(另外,我想让我的酸洗在其他一些不知道 my_func 来自哪个模块的模块中完成)。

尝试3:莳萝

我认为 package dill可以让你在 main 中序列化东西并将它们加载到其他地方。所以我尝试了:

dill_pickle_script_1.py

dill_pickle_script_2.py

然而,现在我有另一个问题:运行时dill_pickle_script_2.py,我得到一个NameError: global name 'time' is not defined. 似乎 dill 没有意识到 my_func 引用了该time模块并且必须在加载时导入它。

我的问题?

如何在 main 中序列化一个对象,然后在另一个脚本中再次加载它,以便该对象使用的所有导入也被加载,而无需在尝试 2 中进行讨厌的小黑客攻击?

0 投票
1 回答
2796 浏览

python-3.x - 带有 lambdas 的 python pickle 对象

如何腌制包含 lambdas 的 python 对象?

是我在尝试腌制https://github.com/marcotcr/lime/blob/97a1e2d7c1adf7b0c4f0d3b3e9b15f6197b75c5d/lime/discretize.py时遇到的错误https://github.com/marcotcr/lime/blob/2703bcdcddd135947fe74e99cc270aa4fac3263 /lime_tabular.py#L88 LimeTabularExplainer

0 投票
0 回答
731 浏览

python - 使用 dill 腌制类实例并加载到不同的包中

我正在尝试使用 dill 在两个不同的环境(机器学习研究和生产)之间共享对象。

一个简化的例子:

package_a/module_a.py:

package_a/module_b.py:

现在我正在尝试将此对象加载到不同 repo package_b/prod.py 中的不同包中:

我得到的错误是:

Dills 似乎尝试从调用 save 函数的模块重新导入导入。如果我将 module_b 中的内容包含在 module_a 中(例如在一个if __name__=="__main__"块中),一切正常。但这不可行,因为有很多对象需要腌制。我正在使用 python 3.5。我真的不明白是什么原因造成的,以及为什么 dill 会记住导入路径。如果我收到一个抱怨A不在命名空间中的错误(即使 dill 应该将类定义与实例打包),我可以理解,但这我真的无法理解。

0 投票
2 回答
7861 浏览

python - 无法在 python 3 中腌制 lambda 函数

在 Python 2 中使用dilllambda 函数的酸洗可以正常工作,但在 Python 3 中却不行,有没有其他选择?

蟒蛇 3:

pickle.PicklingError: Can't pickle at 0x104e97840>: 在main上的属性查找失败

蟒蛇 2.7:

cdill.dill\n_create_function\np0\n(cdill.dill\n_load_type\np1\n(S'CodeType'\np2\ntp3\nRp4\n(I1\nI1\nI2\nI67\nS'|\x00\x00d\x01 \x00\x13S'\np5\n(NI2\ntp6\n(t(S'x'\np7\ntp8\nS''\np9\nS''\np10\nI1\nS''\np11\n(t (ttp12\nRp13\nc__main__\n__dict__\ng10\nNN(dp14\ntp15\nRp16\n.