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

Pra*_*ind 5 python time scrapy python-2.7 raspberry-pi

当我在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())
Run Code Online (Sandbox Code Playgroud)

输出如下:

0.193569
0.194114
0.194458
6.315348
Run Code Online (Sandbox Code Playgroud)

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

可能是什么原因?

一些旁注:

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

Wil*_*sem 4

但这根本不重要,因为它还没有被执行,对吗?

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

您可以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))
Run Code Online (Sandbox Code Playgroud)

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

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

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