如何避免每次脚本运行时重新导入模块并重新定义大对象

时间:2016-10-10 01:13:40

标签: python python-2.7 optimization import load

这必须有答案,但我找不到。我正在使用一个名为quippy的相当大的python模块。使用这个模块,可以定义一个分子间电位,用作ASE中的计算器,如下所示:

from quippy import *
from ase import atoms
pot=Potential("Potential  xml_label=gap_h2o_2b_ccsdt_3b_ccsdt",param_filename="gp.xml")
some_structure.set_calculator(pot)

这是脚本的开头。问题是import大约需要3秒,而pot=Potential...需要大约30秒才能获得100%的CPU负载。 (我相信这是由于解析了一个大的ascii xml文件。)如果我要以交互方式输入,我可以保持导入的模块和潜在的定义,但是在运行脚本时,它会在每次运行时再次完成。

我可以在运行之间将模块和潜在对象保存在内存/磁盘中吗?也许保持一个python进程空闲并将这些东西保存在内存中?或者在解释器中运行这些行,并以某种方式从那里调用其余的脚本?

任何方法都可以,但有些帮助是值得赞赏的!

2 个答案:

答案 0 :(得分:0)

您可以使用原始文件或pickle等模块轻松存储数据。

import cPickle as pickle
from quippy import Potential
try:  # try previously calculated value
    with open('/tmp/pot_store.pkl') as store:
        pot = pickle.load(store)
except OSError:  # fall back to calculating it from scratch
    pot = quippy.Potential("Potential  xml_label=gap_h2o_2b_ccsdt_3b_ccsdt",param_filename="gp.xml")
    with open('/tmp/pot_store.pkl', 'w') as store:
        pot = pickle.dump(pot, store)

对此有各种各样的优化,例如检查你的pickle文件是否比产生它的值的文件旧。

答案 1 :(得分:0)

我找到了一个解决方案,但我对替代方案很感兴趣。您可以将脚本分为两部分:

start.py:

from quippy import Potential
from ase import atoms
pot=Potential(...  etc...

body.py:

for i in range(max_int):
      print "doing things"
# etc...

然后输入python interpreter并只运行start-script一次,但是根据需要运行body:

me@laptop:~/dir$ python
>>> execfile('start.py')
>>> execfile('body.py')
>>> #(change code of "body.py" in editor)
>>> execfile('body.py') # again without reloading "start.py"

所以这意味着终端被占用并且脚本受到影响,但它可以工作。