如果我像這樣(第 2 行)(在之前分配了一個值之后)將一個變數分配給它自己的值:
a_list = ['a', 'list']
a_list = a_list
這是否編譯為實際分配或只是跳過?
我問是因為我想知道以下兩個代碼片段中的后者是否會受到性能損失。
def foo(a_list: list = None):
if a_list is None:
a_list = ['default', 'list', 'values']
def foo(a_list: list = None):
a_list = ['default', 'list', 'values'] if a_list is None else a_list
uj5u.com熱心網友回復:
可以通過dis.dis呼叫自己驗證為這兩種方法生成的位元組碼。(檢查@petrch 的回答)
然而,與您的完整代碼將使用的其他資源相比,身份分配的“成本”將可以忽略不計:這種微優化并不意味著在 Python 代碼中完成:如果 CPU 周期計數在這個級別,您應該使用直接映射到 CPU 操作的語言,例如 C、GO 或 Rust。
也就是說,第一種形式,即使多出一行和縮進一級,也“更容易閱讀”。我會選擇第一種形式。單執行緒可能會在“也許這性能較差”的執行緒中轉移火車這一事實是不值得的(正如您提出這個問題所證明的那樣)
uj5u.com熱心網友回復:
您可以在dis模塊的幫助下輕松地自行檢查。結果可能(并且可能)在 python 版本之間發生變化:https :
//docs.python.org/3/library/dis.html
import dis
>>> def foo(a_list: list = None):
... a_list = ['default', 'list', 'values'] if a_list is None else a_list
...
>>> dis.dis(foo)
2 0 LOAD_FAST 0 (a_list)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 8 (is)
6 POP_JUMP_IF_FALSE 18
8 LOAD_CONST 1 ('default')
10 LOAD_CONST 2 ('list')
12 LOAD_CONST 3 ('values')
14 BUILD_LIST 3
16 JUMP_FORWARD 2 (to 20)
>> 18 LOAD_FAST 0 (a_list)
>> 20 STORE_FAST 0 (a_list)
22 LOAD_CONST 0 (None)
24 RETURN_VALUE
>>> def foo(a_list: list = None):
... if a_list is None:
... a_list = ['default', 'list', 'values']
...
>>> dis.dis(foo)
2 0 LOAD_FAST 0 (a_list)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 8 (is)
6 POP_JUMP_IF_FALSE 18
3 8 LOAD_CONST 1 ('default')
10 LOAD_CONST 2 ('list')
12 LOAD_CONST 3 ('values')
14 BUILD_LIST 3
16 STORE_FAST 0 (a_list)
>> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/372451.html
