Python:默认参数值 vs 全局变量

3

我在Python的Queue模块中看到了这个默认值用法:

def _put(self, item, heappush=heapq.heappush):
    heappush(self.queue, item)

def _get(self, heappop=heapq.heappop):
    return heappop(self.queue)

我想知道为什么在这里将变量用作函数参数?这只是一种口味上的问题还是某种优化?
1个回答

4

这是一个微小的优化。默认值只在函数定义时计算一次,局部变量(包括参数)比全局变量更快速地访问,它们被实现为C数组查找,而不是 dict 查找。还可以避免反复查找 heapqheappushheappop 成员,而不会直接拉取它们污染命名空间。

Timeit 代码段:

python -mtimeit --setup "import heapq" --setup "def f(q,x,p=heapq.heappush): p(q,x)" "f([], 1)"
1000000 loops, best of 3: 0.538 usec per loop

python -mtimeit --setup "import heapq" --setup "def f(q,p=heapq.heappop): p(q)" "f([1])"
1000000 loops, best of 3: 0.386 usec per loop

python -mtimeit --setup "import heapq" --setup "def f(q,x): heapq.heappush(q,x)" "f([], 1)"
1000000 loops, best of 3: 0.631 usec per loop

python -mtimeit --setup "import heapq" --setup "def f(q): heapq.heappop(q)" "f([1])"
1000000 loops, best of 3: 0.52 usec per loop

1
你能提供一下数组查找的参考吗? - ramcdougal
+1,这在我的Py2.7上节省了几个纳秒。请注意,当前的tip将堆函数导入其命名空间:http://hg.python.org/cpython/file/tip/Lib/queue.py - Fred Foo
1
@ramcdougal 为了更快:[1](https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Local_Variables)为了成为数组查找:首先,`dis` 显示本地和全局名称使用不同的字节码操作(LOAD_GLOBAL vs LOAD_FAST)。其次,通过 ceval.c 深入挖掘将显示 LOAD_FAST 被映射到 GETLOCAL,它是在同一文件中早期定义的宏,该宏扩展为 fastlocals[i],这是在执行解释的 ceval.c 中的各种函数中动态分配的数组。 - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接