37

重複の可能性:
必要なインデックスのみ:列挙または(x)範囲?

これらのうち、より良い/より明確な/より速い/より多くの「Pythonic」と見なされるのはどれですか?リストの内容は気にせずL、どれだけの長さかは気にしません。

a = [f(n) for n, _ in enumerate(L)]

また

a = [f(n) for n in range(len(L))]

違いがあれば、関数もf利用len(list)します。

4

4 に答える 4

32

いくつかのクイックタイミング実行はrange()、わずかなエッジを使用して2番目のオプションを提供するようですenumerate()

timeit a = [f(n) for n, _ in enumerate(mlist)]
10000 loops, best of 3: 118 us per loop

timeit a = [f(n) for n in range(len(mlist))]
10000 loops, best of 3: 102 us per loop

楽しみのためにxrange()(Python v2.7.2)

timeit a = [f(n) for n in xrange(len(mlist))]
10000 loops, best of 3: 99 us per loop

私は最初に読み取り可能なコードを好み、次に利用xrange()可能な場合(つまり、Pre-Python v 3.x)を使用し、次にrange()とを使用しますenumerate()

于 2012-08-16T15:06:11.647 に答える
7

(x)rangeソリューションはオーバーヘッドが少ないため高速であるため、これを使用します。

Python 2.xでは、一時リストが作成されないため、使用するメモリが少ないため、xrangeの代わりに使用します。Python 3.xには、メモリの少ないバージョンである、のみがあります。rangexrangerange

したがって、Python 2.xでは、繰り返しrange(n)O(n)メモリを一時的に使用し、繰り返しxrange(n)O(1)メモリを一時的に使用します。ランタイムは両方ともO(n)です。

于 2012-08-16T15:05:29.373 に答える
4

enumarate関数の「_」属性を使用していないので、範囲を使用すると読みやすくなります。

于 2012-08-16T15:06:45.227 に答える
2

Python 2.xを使用していると仮定すると、を使用する場合は、範囲内の数値のリストが作成されないようにするためにlen()使用する必要があります。xrange()

len()そしてこの場合、リスト内のアイテムではなく、インデックスを使用しているので、私は一緒に行きます。

于 2012-08-16T15:07:00.820 に答える