2017-06-08 296 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

这里有更多的因素,但有三个主要的:

首先 - 导入一个模块需要查找您系统上的模块,这需要从磁盘读取数据。

其次,如果在这些模块内部做了任何更改,解释器需要对它们进行咬合编译。

最后但并非最不重要的是,当解释器开始导入它们时,模块本身可能包含需要执行的指令/代码,这可能会执行很多操作。说想象其中一个模块连接到数据库或必须通过一个大的哈希表过滤...

编辑:我应该指出,这些都是假设,很难说你的情况究竟发生了什么,但在大多数情况下这是发生了什么情况。

相关问题