2016-10-10 23 views
2

這必須有一個答案,但我無法找到它。我正在使用一個叫做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秒,CPU負載爲100%。 (我相信這是由於解析一個大的ascii xml文件。)如果我將以交互方式打字,我可以保持導入的模塊和潛在的定義,但是在運行腳本時,它會在每次運行時再次完成。

我可以在運行之間將模塊和潛在對象保存在內存/磁盤中嗎?也許保持一個Python進程閒置並將這些東西保存在內存中?或者在解釋器中運行這些行,並以某種方式從那裏調用腳本的其餘部分?

任何方法都很好,但有些幫助是值得讚賞的!

+0

你多久打一次電話?如果你有足夠的內存,你的操作系統會緩存'import'中使用的模塊文件。如果你想存儲'pot',只需將它寫入一個文件,例如使用'pickle'。 – MisterMiyagi

回答

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文件是否比生成它的值的文件早。

+0

我要用你的代碼嘗試wthis,但我其實只是嘗試與cPickle,我沒有得到它的工作。但你對原始文件有什麼意義?我認爲把它作爲一個二進制保存就可以了,但是如何? –

+0

你是什麼意思的「沒有得到它的工作」?它是py2.7標準庫的一部分。原始文件只是您在其上沒有任何庫的情況下編寫純字符串的文件。例如,如果'pot'是一個浮點數,你可以執行'store.write(str(pot))'和'float(store.readline()。strip())'。 – MisterMiyagi

+0

我沒有很好的配方。 cPickle在轉儲和加載時都沒有給出錯誤,但是當試圖運行加載的潛力時,我得到了一個錯誤。看着這個文件只有幾個字節,並不接近真實物體的大小。 –

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解釋器和運行啓動腳本只一次,但身體儘可能多的:

[email protected]op:~/dir$ python 
>>> execfile('start.py') 
>>> execfile('body.py') 
>>> #(change code of "body.py" in editor) 
>>> execfile('body.py') # again without reloading "start.py" 

所以這意味着一個終端被佔領和腳本受到影響,但它窩RKS。

相關問題