2014-10-19 1 views
1

을 슬라이싱 내장 뒤바뀜 사용 : 내장 매크로 시퀀스 역전 특별히이 있지만이 경우 시퀀스 반대로, 다수의 방식이있는 대신 목록 파이썬

l = [1,2,3] 
reversed(l) #returns a reverse iterator 
l[::-1] #returns a reverse sequence 

를, 그것은 더 간결 목록 조각을 사용하십시오. 또한 목록 슬라이싱은 __getitem____len__을 지원하는 전체 Sequence을 반환하며 reversed은 반복기입니다. 마지막으로 reversed에는 Sequence이 필요합니다. 즉, 목록 슬라이싱이 거의 항상 작동합니다.

reversed 내장 목록 슬라이스를 사용하면 어떤 이점이 있습니까?

답변

4

list[::-1]은 목록의 새로운 역 사본을 반환합니다. 목록의 크기에 따라 더 많은 메모리를 소비합니다. sizeof the list object + sizeof (pointer) * len (목록)

전체 목록 항목을 한 번에 필요로하지 않으면 reversed을 사용하는 것이 더 바람직합니다. 기억의 조건. 예를 들어, 목록을 역순으로 반복하면 항목을 한 번에 처리 할 필요가 없습니다.

+1

원래 목록으로 메모리만큼을 소비하지 않기 때문에 새 목록의 포인터 여전히 메모리 (얕은 사본)의 동일한 객체를 가리 킵니다. 추가 메모리는 목록 개체 +4 * len (lst) **의 크기가 될 것입니다. (각 포인터 당 4 개, 빈 목록의 크기는 내 시스템에서 약 36 바이트입니다) –

+0

@AshwiniChaudhary, 지적 해 주셔서 감사합니다. 그에 따라 대답을 업데이트했습니다. – falsetru

3

"reversed은 시퀀스가 ​​필요합니다"라고 말하는 것은 정확하지 않습니다. Python 2.6 이상에서 reversed__reversed__ 메소드를 정의하는 모든 객체에서 작동합니다. 따라서 정수 인덱싱을 지원하지 않는 객체에서 작업 할 수 있지만 분할은 수행 할 수 없습니다.

따라서 시퀀스의 세그먼트 만 뒤집을 때 슬라이스를 사용하거나 한 번에 두 개 이상의 요소가 필요하거나 단계 크기를 제어해야 할 수 있습니다. @ falsetru의 대답에 대한 메모리 고려 사항에 따라 모든 요소를 ​​반복하거나 사용자 정의 반전 동작이있는 객체가있는 경우에만 reversed을 사용하십시오.

-1

오산, 의견 작성자는 rev_func가 목록을 반환하지 않았으며 목록 반복자를 반환하고 있다고 설명했습니다. 죄송합니다.

내가 고칠 때 결과는 본질적으로 동일합니다.

사용 [:: - 1] : 1.6161760782445813 )의 (반전 사용 : 1.7324838771408098이

import timeit 
import random 

def rev_slice(big_list): 
    return big_list[::-1] 


def rev_func(big_list): 

    #return reversed(big_list) 
    return list(reversed(big_list)) 


big_list = [random.random() for i in range(10000000)] 

slice_t = timeit.Timer("foo = rev_slice(big_list)", "from __main__ import big_list, rev_slice") 
slice_time = slice_t.timeit(10) 
print ("Using [::-1]: {0}".format(slice_time)) 

func_t = timeit.Timer("foo = rev_func(big_list)", "from __main__ import big_list, rev_func") 
func_time = func_t.timeit(10) 
print ("Using reversed(): {0}".format(func_time)) 
+0

반전은 반복자를 반환하기 때문에 목록 생성이나 루프가 일어나지 않기 때문입니다. 따라서 목록 크기에 전혀 의존하지 않으므로 일정한 시간이 소요됩니다. –

+0

오 이런, 네 말이 맞아. 그리고 일단 고정되면 결과는 본질적으로 동일하고 어쩌면 역전 된 경우에는 더 느릴 수도 있습니다. – user3556757