2012-07-14 1 views
7

파이썬 3.2.3을 사용하고 있습니다. 반대로 목록을 반복하는 가장 빠른 방법은 무엇입니까? [:: - 1], reverse, list.reverse() 아니면 다른 방법일까요? 나는 대략 5e6 요소 정도의리스트를 다루고 있으므로리스트를 복사하는 것을 피할 필요가있다.가능한 빨리 역순으로 파이썬리스트를 반복 할 필요가 있습니다

+3

직접 테스트해야합니다. ['timeit' 모듈 (http://docs.python.org/library/timeit.html))을 확인하시기 바랍니다. –

답변

13
>>> from timeit import Timer 
>>> t = Timer('[x for x in l[::-1]]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
5.549649953842163 
>>> t = Timer('l.reverse(); [x for x in l]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.548457145690918 
>>> t = Timer('[x for x in reversed(l)]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.428632974624634 

결론 : 반대() 100000 개의 항목이있는 목록에서 l.reverse()보다 약간 빠릅니다. 물론 이것은 실제로 전체 목록을 반복하지 않으면 훨씬 더 사실입니다. 목록을 두 번 이상 사용하면 사실이 아닙니다.

l[::-1]reversed()을 도입 한 이후 구식입니다.

13

reversed은 반복자를 반환하므로 목록을 복사하지 않으므로 한 번에 하나의 요소 만 생성해야합니다. (reversed 원래 목록을 수정하지 않는 반면, list.reverse() 또한 목록을 복사하지 않습니다,하지만 그것을 변이, 그래서 목록 작업을 완료 한 후 뒤쪽으로 될 것입니다.)

+1

반복자는 반드시 복사를 막지는 않지만,이 경우에는 작동합니다. –

+1

사실, 일반적으로 반복자를 제공하는 내장 파이썬 함수는 전체 목록을 한 번에 생성하지 않습니다. 그것이 그들의 전체 요점입니다. – BrenBarn

관련 문제