Save/load 同情 lambdifed 表达式
Save/load sympy lambdifed expressions
设想以下三步过程:
- 我使用 sympy 构建了一个大而复杂的表达式(这个过程花费了大量时间)。
- 然后使用
sympy.lambdify
(也很慢)将该表达式转换为 lambda 函数。
- 然后评估所述函数(快速)
理想情况下,步骤 1 和步骤 2 只执行一次,而步骤 3 将被评估多次。不幸的是,第 3 步的评估随着时间的推移而分散(以及不同的 python 会话!)
我正在寻找一种将 "lambdified" 表达式保存到磁盘的方法,以便以后可以加载和使用它们。不幸的是 pickle 不支持 lambda 函数。我的 lambda 函数也使用 numpy。
我当然可以手动创建一个匹配函数并使用它,但这似乎效率低下且容易出错。
您可以使用 "dill",如此处所述
和
How to use dill to serialize a class definition?
您必须导入 dill 并将变量 'recursive' 设置为值 "True"。
import dill
dill.settings['recurse'] = True
假设 f 是您的 lambdified 函数。您可以使用以下命令将其转储到磁盘。
dill.dump(f, open("myfile", "wb"))
之后您可以使用以下行加载函数。这也可以通过另一个 python 脚本完成。
f_new=dill.load(open("myfile", "rb"))
以上效果很好。
在我使用 Python 3.6 的情况下,我需要明确指出保存和加载的文件是二进制文件。于是将上面的代码修改为:
dill.dump(f, open("myfile", "wb"))
阅读:
f_new=dill.load(open("myfile", "rb"))
设想以下三步过程:
- 我使用 sympy 构建了一个大而复杂的表达式(这个过程花费了大量时间)。
- 然后使用
sympy.lambdify
(也很慢)将该表达式转换为 lambda 函数。 - 然后评估所述函数(快速)
理想情况下,步骤 1 和步骤 2 只执行一次,而步骤 3 将被评估多次。不幸的是,第 3 步的评估随着时间的推移而分散(以及不同的 python 会话!)
我正在寻找一种将 "lambdified" 表达式保存到磁盘的方法,以便以后可以加载和使用它们。不幸的是 pickle 不支持 lambda 函数。我的 lambda 函数也使用 numpy。
我当然可以手动创建一个匹配函数并使用它,但这似乎效率低下且容易出错。
您可以使用 "dill",如此处所述
和
How to use dill to serialize a class definition?
您必须导入 dill 并将变量 'recursive' 设置为值 "True"。
import dill
dill.settings['recurse'] = True
假设 f 是您的 lambdified 函数。您可以使用以下命令将其转储到磁盘。
dill.dump(f, open("myfile", "wb"))
之后您可以使用以下行加载函数。这也可以通过另一个 python 脚本完成。
f_new=dill.load(open("myfile", "rb"))
以上效果很好。 在我使用 Python 3.6 的情况下,我需要明确指出保存和加载的文件是二进制文件。于是将上面的代码修改为:
dill.dump(f, open("myfile", "wb"))
阅读:
f_new=dill.load(open("myfile", "rb"))