2016-06-14 13 views
0

は、例えばmyfoo0()Pythonのリスト展開は、これは高価ですか?それは非効率的ですか?

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

、これは以下のように使用されていることを、私は複数の要素を返すPythonの機能を持っていると仮定します。fitのエントリのいくつかを使用する機能を検討し、

fit = myfoo0(); 

入力として。

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

は今、私はそれが簡単に私はこのように書いた場合つもりで読むことを見つける:たとえば、私は多くの機能myfoo1、...、myfoonそれぞれを持っている場合

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

(例はあります) fitの異なるコンポーネントを使用して 私の質問は myfoo1の体内 fitのエントリの命名と上記のコードは、()は、この1に()パフォーマンスの観点から比較しない方法です:

特に

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

は、関数内開梱タプルを有する溶液が(コピーの点で例えば)かなりの追加コストを招くある

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

+3

どこにでも深いコピーを作成しているわけではありません。ここのコピーはすべて浅いです。しかし、この場合、リスト(または他のオブジェクト)のネストが2レベル以上あることは決してありません。この場合、深い部分と浅い部分が等価です。深いコピーの例は、リストのリストがあり、両方のレベルのすべてのリストがコピーされている場合です。浅いコピーは、ネストされたリストが共有されている最上位のリストのみをコピーします。 –

+1

これはまったく同じです。 – BadZen

+0

[OK]を、私は彼らがこの文脈で意味したことを誤解した深いコピーに言及を削除しました。私の質問は、最初のコンストラクトが何とか非効率的であることです - 私は(IMHO)の明快さのためにコストを負担しましたか? – user189035

答えて

2

いくつかの誤解がここにあります

  1. fit = myfoo0();は何もコピーされません。 fitは、コピーではなく、myfoo0()によって返されたリストへの参照にすぎません。

  2. [a, b, c] = myfoo0();また、新しいリストも作成されません。一方、3つの変数がそれぞれ第1、第2、第3のリストメンバーへの参照になっています。

  3. out = myfoo1(fit)は同じではないmyfoo1(a)です。最初の呼び出しは最初の引数として渡されたリストを持つmyfoo1を呼び出し、2番目の呼び出しは、最初の引数として渡された最初のリストメンバーでmyfoo1を呼び出します。

+0

申し訳ありません、編集された質問をご覧ください:あなたの回答を読む私は不幸な編集中に質問の一部を間違って削除してしまったことを実感しました〜 – user189035

+3

@ user189035申し訳ありません、現状のあなたの質問はかなり混乱しています。なぜあなたは2つのスニペットが異なる動作をすると思いますか?グローバル変数とローカル変数のアクセス時間が異なっていると想定している場合を除き、まったく同じです(これは同じです)。それでも、私たちはこのような無限小の違いについて話しています。これがあなたにとって最も時間のかかるアルゴリズムでなければ、おそらく注目すべき違いを測定することさえできないでしょう。早期の最適化について話しています... –

+0

@Sebastien Hoffmann:あなたのコメントで私の質問に答えました。「パフォーマンスに関して2つの構文の違いはごくわずかです。 – user189035

関連する問題