python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?
匿名用戶
除了局部/全局變量存儲時間外,操作碼預(yù)測使函數(shù)更快。
正如其他答案所解釋的,該函數(shù)在循環(huán)中使用store_fast操作碼。下面是函數(shù)循環(huán)的字節(jié)碼:>> 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
通常,當(dāng)程序運行時,Python會一個接一個地執(zhí)行每個操作碼,跟蹤a堆棧,并在每個操作碼執(zhí)行后對堆棧幀進(jìn)行其他檢查。操作碼預(yù)測意味著在某些情況下,Python能夠直接跳轉(zhuǎn)到下一個操作碼,從而避免了一些開銷。
在這種情況下,每次Python看到for_iter(循環(huán)的頂部)時,它都會“預(yù)測”store_fast是它必須執(zhí)行的下一個操作碼。然后,Python查看下一個操作碼,如果預(yù)測正確,則直接跳到store_fast。這具有將兩個操作碼壓縮為單個操作碼的效果。
另一方面,store_name操作碼在全局級別的循環(huán)中使用。當(dāng)Python看到這個操作碼時,它不會做出類似的預(yù)測。相反,它必須返回到計算循環(huán)的頂部,這對循環(huán)的執(zhí)行速度有明顯的影響。
為了給出有關(guān)這種優(yōu)化的更多技術(shù)細(xì)節(jié),下面引用ceval.c文件(Python虛擬機的“引擎”):
有些操作碼傾向于成對出現(xiàn),因此當(dāng)?shù)谝粋€代碼運行時,可以預(yù)測第二個代碼。例如,get_iter后面經(jīng)常跟著for_iter。而且for_iter后面通常是store_fast或unpack_sequence。
驗證預(yù)測需要對寄存器變量進(jìn)行一次針對常數(shù)的高速測試。如果配對良好,那么處理器自己的內(nèi)部分支預(yù)測成功的可能性很高,從而導(dǎo)致幾乎零開銷地過渡到下一個操作碼。一個成功的預(yù)測節(jié)省了通過eval-loop(包括它的兩個不可預(yù)測分支,has_arg測試和開關(guān)情況)的行程。與處理器的內(nèi)部分支預(yù)測相結(jié)合,成功的predict具有使兩個操作碼運行的效果,就像它們是一個單獨的帶有主體組合的新操作碼一樣。
我們可以在for_iter操作碼的源代碼中看到預(yù)測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)轉(zhuǎn)到pred_##op,則predict函數(shù)將擴展為,即跳轉(zhuǎn)到預(yù)測操作碼的開始。在這種情況下,我們跳到這里: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;
現(xiàn)在設(shè)置了局部變量,下一個操作碼開始執(zhí)行。Python繼續(xù)通過迭代程序,直到它到達(dá)最后,每次都成功地進(jìn)行預(yù)測。
Python wiki頁面有更多關(guān)于CPython虛擬機如何工作的信息。
總結(jié)
以上是生活随笔為你收集整理的python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad点捕捉不到怎么办 捕捉不到点的解决
- 下一篇: 阴阳师久次良御魂厉害吗 久次良御魂怎么搭