14

このPython List Comprehension Vsを参照してください。マップの質問、誰かがmapリスト内包表記が関数を呼び出さない場合よりも良い結果をもたらす理由を説明できmapますか?

import timeit

print timeit.Timer('''[i**2 for i in xrange(100)]''').timeit(number = 100000)

print timeit.Timer('''map(lambda i: i**2, xrange(100))''').timeit(number = 100000)

print timeit.Timer(setup="""def my_pow(i):
    return i**2
""",stmt="""map(my_pow, xrange(100))""").timeit(number = 100000)

print timeit.Timer(setup="""def my_pow(i):
    return i**2
""",stmt='''[my_pow(i) for i in xrange(100)]''').timeit(number = 100000)

結果:

1.03697046805 <-- list comprehension without function call
1.96599485313 <-- map with lambda function
1.92951520483 <-- map with function call
2.23419570042 <-- list comprehension with function call
4

1 に答える 1

15

すべてのタイミング結果は、これらの事実によって説明できます。

  1. CPython には、かなり高い関数呼び出しのオーバーヘッドがあります。

  2. map(f, it)よりもわずかに高速です[f(x) for x in it]

コードの最初のバージョンでは関数がまったく定義されていないため、関数呼び出しのオーバーヘッドはありません。2 番目のバージョンでは関数を定義する必要があるため、反復ごとに関数呼び出しのオーバーヘッドが生じます。3 番目のバージョンは 2 番目のバージョンと完全に同等です。関数とラムダ式は同じものです。そして、事実 2 によると、最後のバージョンはさらに遅いです。

于 2012-07-23T16:35:20.353 に答える