Python Import 效率对比
1、文件目录结构
├── JupyerMain.ipynb
├── module_a
│ ├── __init__.py
│ └── func_a.py
└── module_b
├── __init__.py
└── class_func.py
2、文件内容
module_a.func_a.py
def func(a, b):
return a, b
module_b.class_func.py
class B(object):
@classmethod
def func(cls, a, b):
return a, b
3、测试文件及其结果
JupyerMain.ipynb
直接模块引入方法
from module_a.func_a import func
def test_func():
func(1, 2)
%timeit -n 1000000 test_func()
129 ns ± 3.65 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
引入模块
from module_a import func_a
def test_func():
func_a.func(1, 2)
%timeit -n 1000000 test_func()
159 ns ± 6.55 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
模块直接引入类(类方式)
from module_b.class_func import B
def test_func():
B.func(1, 2)
%timeit -n 1000000 test_func()
183 ns ± 6.12 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
引入模块(类方式)
from module_b import class_func
def test_func():
class_func.B.func(1, 2)
%timeit -n 1000000 test_func()
212 ns ± 6.03 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
引入后重新赋值方式
from module_b import class_func
B = class_func.B
def test_func():
B.func(1, 2)
%timeit -n 1000000 test_func()
187 ns ± 4.93 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
主要原因:python中使用dot符号访问对性能影响较大,在规范的前提下,应当尽可能避免使用dot访问