2017-12-30 60 views
0

コード1:2Pythonで2つのコードの実行について混乱していますか?

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 

コード:

enter image description here

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 
今私は2つのプログラムの実行について混乱しています、コード2がどのようには、ネストされたの使用にもかかわらず、コードCODE1よりも高速でありますコード2のforループ。下の画像はJupyterのノートブックからのもので、100000回のループからの平均時間を示しています。違いは非常に分ですが、ネストされたfor-loopはどのようにして単一のforループより速く動作するのかが分かりにくいので混乱します。

私は出力を印刷することになったので、コード

+0

各ループの最終行は何ですか?それは本当に何もしません。 differnecは、2行目の 'list'関数に対する余分な呼び出しからのものです。 –

+0

私は出力を印刷することになっていましたので、最後のコード行の前に印刷を置くことができます – Priyansh

答えて

0

それは、ネストされたループではないの最後の行の前に印刷を置くことができます。それはあなたがこの行ここ

for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 

について誤解しているようだ

、あなたはジェネレータを作成し、最初のリストを計算sorted機能

sorted(x[0] for x in students if x[1] == s[1]) 

にそれを渡しています。そして、その式を評価してリストを取得した後、ループによってforが繰り返されます。したがって、2つのループがあり、入れ子になっていません。

+0

ありがとう、Andyしかし、まだCode1の方が大きい入力サイズの時間が指数関数的に増加し、Code2が直線的に増加します。 Code2がCode1よりも速く、優れている理由を教えてください。 – Priyansh

0

これは、第2のケースでループforsorted()にジェネレータが渡されたためです。 sorted()関数は、最初にシーケンスのコピーを作成します。このコピーは、ジェネレータを最初にジェネレータから作成する必要があるため、ジェネレータがリストをリストするよりも遅くなります。質問thisを参照してください。だからリストでジェネレータを置き換えると、はるかに速くなります。

In [11]: %%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted([x[0] for x in students if x[1] == s[1]]): 
    name 
    ....: 
The slowest run took 5.71 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 4.72 µs per loop 

In [6]: %%timeit       
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 
    ...: 
The slowest run took 11.50 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 5.31 µs per loop 
関連する問題