2016-11-12 3 views
0
from timeit import Timer 
def m1(): 
    l = range(100000) 
    for i in l: 
     l[i] *= 2 

def m2(): 
    l = range(100000) 
    l = map(lambda i:i*2,l) 

if __name__ == '__main__': 

    t1 = Timer('m1()','from __main__ import m1') 
    print t1.timeit(100) 

    t2 = Timer('m2()','from __main__ import m2') 
    print t2.timeit(100) 

時間m2のコストはm1のコストを上回っていますが、その理由を説明できますか?Python - マップを使用するのがリストを反復するよりも時間がかかります

マップ関数の実装はイテレータを使用していますか?

おかげ

+6

にあなたがオレンジにリンゴを比較している新しいリストを割り当てます。 1つは新しいリストを構築し、もう1つはリストをインプレースで変更することです。それは確かにランタイムに影響を与えます。 –

+2

'l [i] * = 2'を実行する代わりに、リストの各要素に対してラムダ関数を呼び出す必要があります。それは 'm1'も遅くします。 – Evert

+2

はい、演算子は関数呼び出しより高速です。 –

答えて

0

m2における計算は、ラムダ関数への関数呼び出しを介して行われます。単一行であっても、関数としての資格があり、関数呼び出しのコストがかかります。
さらに、m2は新しいリストを作成し、それを変数lに割り当てます。その新しいリストを作成するコストも考慮する必要があります。

m1には、計算コストがかかります。したがって、m1がより早く終了します。

m1ステップ:変数でリストを作成し

    1. 2つの

    m2ステップとリストl可変l

  1. 複数の各項目のリストを作成します0
  2. ラムダ関数を経由して新しいリストを作成し、リストl
  3. を反復呼び出し、変数l
関連する問題