python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?
匿名用戶
除了局部/全局變量存儲時間外,操作碼預測使函數更快。
正如其他答案所解釋的,該函數在循環中使用store_fast操作碼。下面是函數循環的字節碼:>> 13 FOR_ITER 6 (to 22) # get next value from iterator
16 STORE_FAST 0 (x) # set local variable
19 JUMP_ABSOLUTE 13 # back to FOR_ITER
通常,當程序運行時,Python會一個接一個地執行每個操作碼,跟蹤a堆棧,并在每個操作碼執行后對堆棧幀進行其他檢查。操作碼預測意味著在某些情況下,Python能夠直接跳轉到下一個操作碼,從而避免了一些開銷。
在這種情況下,每次Python看到for_iter(循環的頂部)時,它都會“預測”store_fast是它必須執行的下一個操作碼。然后,Python查看下一個操作碼,如果預測正確,則直接跳到store_fast。這具有將兩個操作碼壓縮為單個操作碼的效果。
另一方面,store_name操作碼在全局級別的循環中使用。當Python看到這個操作碼時,它不會做出類似的預測。相反,它必須返回到計算循環的頂部,這對循環的執行速度有明顯的影響。
為了給出有關這種優化的更多技術細節,下面引用ceval.c文件(Python虛擬機的“引擎”):
有些操作碼傾向于成對出現,因此當第一個代碼運行時,可以預測第二個代碼。例如,get_iter后面經常跟著for_iter。而且for_iter后面通常是store_fast或unpack_sequence。
驗證預測需要對寄存器變量進行一次針對常數的高速測試。如果配對良好,那么處理器自己的內部分支預測成功的可能性很高,從而導致幾乎零開銷地過渡到下一個操作碼。一個成功的預測節省了通過eval-loop(包括它的兩個不可預測分支,has_arg測試和開關情況)的行程。與處理器的內部分支預測相結合,成功的predict具有使兩個操作碼運行的效果,就像它們是一個單獨的帶有主體組合的新操作碼一樣。
我們可以在for_iter操作碼的源代碼中看到預測store_fast的確切位置:case FOR_ITER: // the FOR_ITER opcode case
v = TOP();
x = (*v->ob_type->tp_iternext)(v); // x is the next value from iterator
if (x != NULL) {
PUSH(x); // put x on top of the stack
PREDICT(STORE_FAST); // predict STORE_FAST will follow - success!
PREDICT(UNPACK_SEQUENCE); // this and everything below is skipped
continue;
}
// error-checking and more code for when the iterator ends normally
如果(*next_instr==op)轉到pred_##op,則predict函數將擴展為,即跳轉到預測操作碼的開始。在這種情況下,我們跳到這里:PREDICTED_WITH_ARG(STORE_FAST);
case STORE_FAST:
v = POP(); // pop x back off the stack
SETLOCAL(oparg, v); // set it as the new local variable
goto fast_next_opcode;
現在設置了局部變量,下一個操作碼開始執行。Python繼續通過迭代程序,直到它到達最后,每次都成功地進行預測。
Python wiki頁面有更多關于CPython虛擬機如何工作的信息。
總結
以上是生活随笔為你收集整理的python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad点捕捉不到怎么办 捕捉不到点的解决
- 下一篇: 阴阳师久次良御魂厉害吗 久次良御魂怎么搭