我在Python的Queue模块中看到了这个默认值用法:
def _put(self, item, heappush=heapq.heappush):
heappush(self.queue, item)
def _get(self, heappop=heapq.heappop):
return heappop(self.queue)
我想知道为什么在这里将变量用作函数参数?这只是一种口味上的问题还是某种优化?
这是一个微小的优化。默认值只在函数定义时计算一次,局部变量(包括参数)比全局变量更快速地访问,它们被实现为C数组查找,而不是 dict
查找。还可以避免反复查找 heapq
的 heappush
和 heappop
成员,而不会直接拉取它们污染命名空间。
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
LOAD_GLOBAL
vsLOAD_FAST
)。其次,通过 ceval.c 深入挖掘将显示LOAD_FAST
被映射到GETLOCAL
,它是在同一文件中早期定义的宏,该宏扩展为fastlocals[i]
,这是在执行解释的 ceval.c 中的各种函数中动态分配的数组。 - user395760