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

3 投票
1 回答
575 浏览
提问于 2025-04-18 00:14

我在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里的heappushheappop,而且不会直接把它们引入到命名空间里,避免了命名空间的污染。

时间测试代码片段:

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

撰写回答