這是一個微觀優化。缺省值在函數定義時只計算一次,而局部變量(包括參數)比全局變量要快一些,它們被實現爲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
你可以給數組查找的參考? – ramcdougal
+1,它在我的盒子上的Py2.7中節省了幾個納秒。請注意,當前技巧並沒有將堆函數導入其名稱空間中:http://hg.python.org/cpython/file/tip/Lib/queue.py –
@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