Python 使用Dot方式访问效率分析

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访问

你可能感兴趣的:(python,开发语言)