Python:默认参数值与全局变量
我在Python的队列模块中看到了默认值的用法:
def _put(self, item, heappush=heapq.heappush):
heappush(self.queue, item)
def _get(self, heappop=heapq.heappop):
return heappop(self.queue)
我想知道为什么这里的变量被用作函数的参数?这只是个人喜好,还是有什么优化的原因呢?
1 个回答
4
这是一种微小的优化。默认值只在函数定义的时候计算一次,而局部变量(包括参数)访问起来比全局变量要快一点,因为局部变量是通过C语言的数组查找实现的,而全局变量则是通过字典查找的。这样做还可以避免每次都去查找heapq
里的heappush
和heappop
,而且不会直接把它们引入到命名空间里,避免了命名空间的污染。
时间测试代码片段:
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