从模块导入功能需要很长时间

时间:2017-06-22 13:53:41

标签: python python-2.7 time raspberry-pi scrapy

当我在python脚本中导入模块的自编函数时,加载大约需要6秒。该函数只包含大约50行代码,但由于它尚未执行,因此不应该重要吗?

这是加载函数的脚本:

#/usr/bin/env python

import time
print(time.clock())
from os import chdir
print(time.clock())
from os.path import abspath, dirname
print(time.clock())
from Project.controllers.SpiderController import RunSpider
print(time.clock())

输出如下:

0.193569
0.194114
0.194458
6.315348

我也尝试导入整个模块,但结果是一样的。

原因可能是什么?

一些旁注:

  • 我使用的是python 2.7.9
  • 该模块使用scrapy框架
  • python脚本在Raspberry Pi 1 Model B上运行

1 个答案:

答案 0 :(得分:3)

  

但这甚至不应该重要,因为它还没有被执行呢?

函数本身的代码 未执行,但文件中的代码已执行。这是合乎逻辑的,因为该文件可能包含装饰器,库调用,内部常量等。甚至可能该函数是 build (因此算法构造函数)。

使用from <module> import <item>进行几乎正常的导入,但是只创建一个对该包中项目的引用。

因此,如果在模块中编写了一个程序(不是if __name__ == '__main__':中的作用域),或者导入了大量其他库,则可能需要很长时间。

例如可以构造一个类似的函数:

def foo(x):
    return x + 5

def bar(y):
    return y * 2

def qux(x):
    return foo(bar(x))

如果您随后运行from module import qux,那么首先必须定义foobar,因为qux取决于这些。

此外,虽然代码本身没有执行,但解释器将分析函数:它将源代码转换为语法树并进行一些分析(哪些变量是本地的,等等)。

最后请注意,程序包通常有一个__init__.py文件,用于初始化程序包。该文件也被执行,也可能需要相当长的时间。例如,某些具有数据库连接的软件包已经建立了与该数据库的连接,并且在数据库响应连接之前可能需要一些时间。