这必须有答案,但我找不到。我正在使用一个名为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进程空闲并将这些东西保存在内存中?或者在解释器中运行这些行,并以某种方式从那里调用其余的脚本?
任何方法都可以,但有些帮助是值得赞赏的!
答案 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"
所以这意味着终端被占用并且脚本受到影响,但它可以工作。