2016-09-12 7 views
1
$ python -m timeit -s'tes = "987kkv45kk321"*100' 'a = [list(i) for i in tes.split("kk")]' 
10000 loops, best of 3: 79.4 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*100' 'b = list(map(list, tes.split("kk")))' 
10000 loops, best of 3: 66.9 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*10' 'a = [list(i) for i in tes.split("kk")]' 
100000 loops, best of 3: 8.34 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"*10' 'b = list(map(list, tes.split("kk")))' 
100000 loops, best of 3: 7.38 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"' 'a = [list(i) for i in tes.split("kk")]' 
1000000 loops, best of 3: 1.51 usec per loop 

$ python -m timeit -s'tes = "987kkv45kk321"' 'b = list(map(list, tes.split("kk")))' 
1000000 loops, best of 3: 1.63 usec per loop 

목록 작성을 통해 string.split() 목록의 목록을 만드는 것이 왜 짧은 문자열에는 더 빠르지 만 더 긴 문자열에는 더 느린 지 궁금합니다.긴 문자열에 람다없이 목록 이해력 및지도를 표시합니다.

+0

분할에 대한 긴 목록을 검색하면 단순히 오버 헤드가 증가합니다. – Evert

답변

0

map의 고정 설치 비용은 listcomp 솔루션의 설치 비용보다 높습니다. 그러나 map에 대한 항목 당 비용은 낮습니다. 따라서 짧은 입력의 경우 고정 된 설정 비용으로 map이 더 많은 비용을 지불합니다 (항목 수가 너무 적기 때문에 항목 당 비용이 절약됩니다). 항목 수가 증가하면 map의 고정 설정 비용은 변경되지 않지만 항목 당 절감액이 더 많은 항목에 대해 수확되므로 map이 천천히 앞으로 당깁니다.

  1. 만합니다 (listcomp가 먼저 중첩 된 글로벌 범위를 확인한 후, 모든 단일 루프 내장 네임 스페이스를 조회 할 수 있습니다 일단 list 있기 때문에 '할 수 조회 : map가에 저장하는 것이

    것들 0 보증 list은 루프에서 루프로 대체되지 않습니다.

  2. 매핑 기능이 C 레벨이기 때문에 항목별로 파이썬 바이트 코드를 실행하지 않으므로 인터프리터가 전혀 개입하지 않아 핫 C 레벨이 감소합니다 코드

map은 실제 호출시 map (C 내장 함수는 실행 속도는 빠르지 만 호출 시간이 상대적으로 느립니다. 특히 가변 길이 인수를 사용하는 경우) 및 map 개체를 생성 및 정리할 때 손실됩니다 (listcomp 클로저는 앞에서 집계). 그러나 위에서 언급했듯이 이들 중 어느 것도 입력 크기에 묶여 있지 않으므로 매핑 함수가 C 내장 함수 인 경우 빠르게 채울 수 있습니다.

0

이런 종류의 타이밍은 기본적으로 쓸모가 없습니다.

당신이 얻는 시간 프레임은 마이크로 초입니다. 그리고 당신은 각 상호 작용에서 수십 개의 서로 다른 1 문자 길이 요소 목록을 만들고있는 중입니다. 기본적으로 선형 유형을 만듭니다. 왜냐하면 생성하는 객체의 수가 문자열 길이에 비례하기 때문입니다. 이것에 놀랄 일은 거의 없습니다.

+0

아! 알았어, 나는 선형적인 것을 이해한다. 감사합니다, btw – wvjgsuhp