2012-08-16 3 views
11

가능한 중복 :
Only index needed: enumerate or (x)range?범위 (len (list)) 또는 열거 (list)?

간주되는 이들 중 어느 것이 더 나은/선명하게/빠른/더 '파이썬'? 나는 목록 L의 내용에 신경을 쓰지 않는다.

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

또는

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

그것이 어떤 차이가 있으면, 함수 flen(list) 이용한다.

+0

어떤 python 버전을 사용하고 있습니까? –

+0

@InbarRose - 2.7 –

답변

18

빠른 타이밍 실행은 enumerate() 이상 range() 약간의 가장자리를 사용하여 2 옵션을 제공하는 것 :

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() (파이썬 2.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() 및을 차례로 사용하십시오. 210.

+0

목록에서 반복적으로 색인 항목에 액세스하려는 경우 enumerate가 빠릅니다. 인덱스 목록 만 원하면 len()과 range/xrange를 사용하는 것이 더 빠릅니다. –

4

(x) 범위 솔루션은 오버 헤드가 적기 때문에 더 빠릅니다.

임시 목록을 만들지 않으므로 xrange이 메모리를 적게 사용하므로 range 대신 xrange을 사용하십시오. Python 3.x에는 메모리가 적은 버전 인 range 만 있습니다.

+0

'xrange'는 제네레이터 객체입니까? [documentation] (http://docs.python.org/library/functions.html#xrange)에는 그 단어에 대한 언급이 없지만 귀하의 설명은 그대로있는 것 같습니다. –

+2

이것은 생성자 객체가 아닙니다 (즉, 본질적으로'yield'를 갖는 순수한 파이썬 코드). 그러나 C와 같이 구현됩니다. 다음 값을 반환하거나 StopIteration을 발생시키는'.next()'메소드를 가지고 있습니다. 'for' 루프는이'.next()'메소드를 반복적으로 호출합니다. (유용하다고 생각되면 제 답변에 투표하십시오.) – pts

0

나는 enumarate 함수에서 "_"속성을 사용하지 않으므로 범위를보다 읽기 쉽도록 사용한다고 말하고 싶습니다.

1

파이썬 2.x를 사용하고 있다고 가정하고 len()을 사용하는 경우 xrange()을 사용하면 범위의 숫자 목록이 작성되지 않으므로 사용해야합니다.

그리고이 경우 목록에서 항목이 아닌 색인을 사용하기 때문에 len()으로 가고 싶습니다.