Python数据结构的性能:定义内部还是外部方法?

2024-05-23 16:51:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个方法,它依赖于dict中存储的一些值。也许这是一个微观优化,但是在方法内部还是外部定义dict更好?还是真的很重要

示例代码:

_values = {'a': 2, 'b': 3}

def add_1(val):
    return _values[val] + 1

或:

def add_1(val):
    _values = {'a': 2, 'b': 3}

    return _values[val] + 1

然后将代码导入并在其他地方使用(即不同的文件)~ from methods import *

在每种情况下,口译员都会采取什么样的方法来寻找口述?我的理解是,在方法的作用域之外查找dict稍微贵一些


Tags: 文件方法代码fromadd示例return定义
2条回答

每个普通函数对象都有一个对定义它的模块的全局命名空间的引用。第一个选项将在该名称空间中执行查找。当模块第一次执行时,字典本身只创建一次。由于引用存储在add_1.__globals__中,因此即使您只使用import methods.add_1from methods import add_1,查找也会正常工作。在“LEGB”中查找“G(lobal)”可能比查找“L(ocal)”慢一些,但我不认为这里会有很大的差别

第二个选项在每次函数运行时创建一个新的dictionary对象。我希望这会超过将引用保存在本地命名空间中的任何查找优化。这种方法提供的一个优点是,它使您的词典有效地保持不变

虽然我直觉上希望第一个选项运行得更快,但您必须为这个微优化做一个基准测试才能确定。我怀疑这与您的Python实现、计算机体系结构、字典大小以及许多其他因素有很大关系

第一个版本更快。每次调用第二个版本时,它都会从头开始创建一个新词典。这是一个小的额外时间,但它是额外的时间:

In [20]: v1 = {'a': 2, 'b': 3}

In [21]: def add_1(val):
    ...:     return v1[val] + 1

In [22]: %timeit add_1('a')
128 ns ± 0.989 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [23]: def add_2(val):
    ...:     v2 = {'a': 2, 'b': 3}
    ...:     return v2[val] + 1

In [24]: %timeit add_2('b')
206 ns ± 3.15 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

相关问题 更多 >