2014-03-27 72 views
3

我看到了Python的Queue模塊在這個默認值用法:的Python:默認參數值VS全局變量

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

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

我不知道爲什麼變量被用作此函數的參數?這只是一個品味或某種優化問題嗎?

回答

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

+0

+1,它在我的盒子上的Py2.7中節省了幾個納秒。請注意,當前技巧並沒有將堆函數導入其名稱空間中:http://hg.python.org/cpython/file/tip/Lib/queue.py –

+1

@ramcdougal爲了更快:[1](https:// wiki.python.org/moin/PythonSpeed/PerformanceTips#Local_Variables)作爲數組查找:首先,'dis'顯示本地名稱和全局名稱使用不同的字節碼操作('LOAD_GLOBAL'與'LOAD_FAST')。其次,通過[ceval.c](http://hg.python.org/cpython/file/2.7/Python/ceval.c)進行挖掘將顯示'LOAD_FAST'被映射到'GETLOCAL',它是早期定義的宏在擴展爲'fastlocals [i]'的同一個文件中,它是ceval.c中執行解釋的各種函數中的動態分配數組。 – delnan