2017-06-08 295 views
1

我看到一個問題,我的python腳本的執行有時可能需要更長的時間才能導入庫。如果我最近沒有執行腳本,或者我從另一臺服務器運行腳本,則會發生這種情況。第一次延期後,進口時間變得更快。我想知道是什麼導致了這個緩慢的導入,如果有什麼辦法來阻止它?導入庫時導致此延遲的原因是什麼?

import time 
s_time = time.time() 
import sys,re,os,logging,signal 
from argparse import ArgumentParser 
print('Internal Import Time: {}'.format(time.time() - s_time)) 
s_time = time.time() 
from backtrace import Backtrace,BacktraceSet 
from report import Report 
from core  import Core 
from burtapi import BurtAPI 
print('External Import Time: {}'.format(time.time() - s_time)) 

在這個例子中,backtrace,report,core和burtapi是我創建的庫。

[[email protected] tool]$ ./tool --python 
Internal Import Time: 2.8281359672546387 
External Import Time: 13.053943157196045 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 
[[email protected] tool]$ ./tool --python 
Internal Import Time: 0.12279081344604492 
External Import Time: 0.6948020458221436 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 

ssh to different server (with same storage mount) 

[[email protected] tool]$ ./tool --python 
Internal Import Time: 3.0217390060424805 
External Import Time: 13.151482105255127 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 
[[email protected] tool]$ 

./tool是一個bash腳本調用python3 /path/to/script.py

+0

這可能是python在首次運行之前生成字節碼(編譯一些庫)所需的時間。這也是當你刪除.pyc文件時可以看到的。更多關於這裏:https://stackoverflow.com/questions/2998215/if-python-is-interpreted-what-are-pyc-files 嘗試刪除您創建庫的文件夾中的.pyc文件和看看是否發生了同樣的事情。 – ma3oun

+0

@ ma3oun Python如何確定何時需要重新編譯?字節碼在__pycache__中,但是如果我等待幾個小時或更改服務器,它將觸發另一個編譯,即使字節碼已經存在。 – Takkun

回答

1

這裏有更多的因素,但有三個主要的:

首先 - 導入一個模塊需要查找您系統上的模塊,這需要從磁盤讀取數據。

其次,如果在這些模塊內部做了任何更改,解釋器需要對它們進行咬合編譯。

最後但並非最不重要的是,當解釋器開始導入它們時,模塊本身可能包含需要執行的指令/代碼,這可能會執行很多操作。說想象其中一個模塊連接到數據庫或必須通過一個大的哈希表過濾...

編輯:我應該指出,這些都是假設,很難說你的情況究竟發生了什麼,但在大多數情況下這是發生了什麼情況。

相關問題