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

时间:2018-10-30 17:10:45

标签: python scope interpreter

我有一个方法依赖于存储在字典中的几个值。也许这是一个微优化,但是在方法内部还是外部定义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会稍微贵一些。

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:1)

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

第二个选项每次函数运行时都会创建一个新的字典对象。我希望这会超过将引用保存在本地名称空间中的所有查找优化。这种方法确实提供的一个优势是,它可以使您的字典有效地保持不变。

虽然我可以直观地期望第一个选项运行得更快,但是您必须为这种微优化做一个基准。我怀疑这与您的Python实现,计算机体系结构,字典大小以及许多其他因素有很大关系。