2017-02-26 8 views
4

私はこれを行う場合は、split()は、各反復?:Pythonでは 'in'演算子が「lazy」ですか?

a = [word for word in post.split() if len(word) > 10] 

が、私はパフォーマンス向上のために代わりにこれを行う必要がありますするために呼び出されるのでしょうか?

s = post.split() 
a = [word for word in s if len(word) > 10] 
+6

これは「怠惰な」という意味ではありません。 – vartec

+0

@vartecもう少し説明してもらえますか、まったく別の話題ですか? – sooqua

+3

これは実際にはin演算子ではありません。同一のキーワードを使用しているにもかかわらず、同じことではないリストの理解の中で、for ... in ...という節です。 – Blckknght

答えて

1

1つの式が正常です - post.split()は1回だけ呼び出されます。

Pythonでforループ反復処理し、オブジェクトの値によっては、反復をサポートするためです - それはCの配列をループするように、あなたが別の言語で表示される場合がありますいくつかの条件文に対するチェックを保持しません

この場合、post.split()は、ループが繰り返されるオブジェクトを生成し、再度呼び出す必要はありません。それはそれは厳密に必要とされるまで、式の評価を遅らせるの実践を指す


怠惰」-nessは、またここで問うべき権利の用語ではありません。ここでは確かにpost.split()に電話するにはが必要です。問題はさらに「効率」の問題です。戦略の詳細については、WikiのLazy evaluationを参照してください。

3

post.split()が1回だけ呼び出されます。あなたはそれが呼び出されるたびに印刷する機能でpost.split()を交換して、それを確認することができます。

>>> post = 'a b c d' 
>>> def split_post(): 
...  print('split_post is called') 
...  return post.split() 
... 
>>> a = [word for word in split_post() if len(word) > 10] 
split_post is called 

あなたは、パフォーマンスのための2つの文に式を分割する必要はありません。