2016-06-14 54 views
0

假設我有一個返回多個元素一個Python函數,例如myfoo0()Python列表解包,這是昂貴的嗎?它效率低下嗎?

def myfoo0(): 
    return([1, 2, 3]) 

,而這被用作:

fit = myfoo0(); 

現在,考慮使用一些fit條目的功能作爲輸入。例如:

def myfoo1(fit): 
    [a, b, c] = fit 
    return(doSomething(a)) 

現在,我覺得更容易閱讀的打算,如果我寫爲:

fit = myfoo0(); 
out = myfoo1(fit) 

(一個例子是,當我有很多的功能myfoo1,...,myfoon各使用的fit 我的問題是如何做上面的代碼(具有myfoo1體內的的fit條目的命名)進行比較(從性能角度)到這一個不同的組件):

[a, b, c] = myfoo0(); 
out = myfoo2(a) 

其中

def myfoo2(a): 
    return(doSomething(a)) 

特別地,是與元組在函數內部拆包溶液招致顯著額外費用(例如,在複製方面)?

+3

你並沒有在任何地方製作深層拷貝。這裏的任何副本都很淺。但在這種情況下,這是一個有爭議的問題,因爲你永遠不會有多於一層的列表(或其他對象)嵌套,在這種情況下,深度和淺度副本是等價的。如果您有一個列表清單,並且這兩個級別的所有列表都被複制,則可以使用深層複製的示例。淺拷貝只會複製頂層列表,並且共享嵌套列表。 –

+1

這是一樣的。 – BadZen

+0

好的,刪除了我所誤解的深層副本的含義。我的問題是:第一個構造效率低下 - 我爲(IMHO)增加了清晰度而招致成本? – user189035

回答

2

有一些誤解的位置:

  1. fit = myfoo0();不會複製任何東西。 fit僅僅是對myfoo0()返回的列表的引用,而不是副本。

  2. [a, b, c] = myfoo0();也不會創建新列表。另一方面,你有3個變量分別是第一,第二和第三個列表成員的引用。

  3. out = myfoo1(fit)是不一樣的myfoo1(a)。第一個調用調用myfoo1,第一個參數作爲第一個參數傳遞,第二個調用調用myfoo1,第一個列表成員作爲第一個參數傳遞。

+0

對不起,請看看編輯過的問題:閱讀你的答案我意識到在不幸的編輯過程中,我意外地刪除了部分問題〜 – user189035

+3

@ user189035對不起,你在當前狀態下的問題很混亂。你爲什麼期望這兩個片段的表現不同?除非你假設全局變量訪問時間與局部變量訪問時間不同(可能是這種情況),否則它們是完全一樣的,這就是這種情況。即便如此,我們正在談論這樣一個無限小的差異,除非這是您最耗時的算法中最關鍵的部分,否則您甚至無法衡量顯着的差異。談論過早的優化... –

+0

@Sebastien Hoffmann:您在評論中回答了我的問題「兩種語法在性能方面的差異可以忽略不計」 – user189035