Python 사전 과 목록 성능 간 의 비교
4.567917.앞에서 우 리 는'대 O 표현법'과 서로 다른 알고리즘 에 대한 평 가 를 알 게 되 었 다.다음은 Python 두 가지 내 장 된 데이터 형식 과 관련 된 각종 작업 의 대 O 수량 급:목록 list 와 사전 dict 를 토론 한다4.567917.이것 은 Python 에서 매우 중요 한 데이터 유형 으로 그 다음 에 각종 데이터 구 조 를 실현 하고 운행 시험 을 통 해 각종 조작 운행 시간 수량 급 을 평가 할 것 이다list 와 dict 를 비교 하 는 작업 은 다음 과 같 습 니 다.
List 목록 데이터 형식 상용 조작 성능:
가장 많이 사용 되 는 것 은 색인 에 따라 값 을 추출 하고 할당(v=a[i],a[i]=v)입 니 다.목록 의 무 작위 접근 특성 으로 인해 이 두 작업 의 실행 시간 은 목록 크기 와 상 관 없 이 모두 O(1)입 니 다.
다른 하 나 는 목록 이 늘 어 나 면 append()와'+'를 선택 할 수 있 습 니 다.lst.append(v),실행 시간 은 O(1)입 니 다.lst=lst+[v],실행 시간 은 O(n+k)입 니 다.그 중에서 k 는 추 가 된 목록 길이 입 니 다.어떤 방법 으로 목록 을 조작 하 는 지 선택 하 는 것 도 프로그램의 성능 을 결정 합 니 다.
n 개의 정수 목록 을 만 드 는 4 가지 방법 을 테스트 합 니 다:
Timer 대상 을 만 들 고 반복 적 으로 실행 해 야 할 문구 와 한 번 만 실행 해 야 할'설치 문'을 지정 합 니 다.
그리고 이 대상 의 timeit 방법 을 호출 하여 몇 번 반복 되 는 지 지정 합 니 다.
# Timer(stmt="pass", setup="pass") #
# stmt:statement , ,
# setup: ( run , )
time1 = Timer("test1()", "from __main__ import test1")
print("concat:{} seconds".format(time1.timeit(1000)))
time2 = Timer("test2()", "from __main__ import test2")
print("append:{} seconds".format(time2.timeit(1000)))
time3 = Timer("test3()", "from __main__ import test3")
print("comprehension:{} seconds".format(time3.timeit(1000)))
time4 = Timer("test4()", "from __main__ import test4")
print("list range:{} seconds".format(time4.timeit(1000))
결 과 는 다음 과 같다.이 를 통 해 알 수 있 듯 이 4 가지 방법 은 운행 시간 차이 가 매우 크 고 목록 연결(concat)이 가장 느 리 며 List range 가 가장 빠 르 고 속도 차이 가 100 배 에 가깝다.append 는 concat 보다 훨씬 빠르다.또한,우 리 는 목록 유도 식 속도 가 append 의 두 배 정도 되 는 것 을 알 게 되 었 다.
총 결 목록 기본 작업 의 대 O 수량 레벨:
pop 이 동작 을 알 게 되 었 습 니 다.pop()은 목록 끝 에서 요 소 를 제거 하고 시간 복잡 도 는 O(1)입 니 다.pop(i)은 목록 중부 에서 요 소 를 제거 하고 시간 복잡 도 는 O(n)입 니 다.
그 이 유 는 Python 이 선택 한 실현 방법 입 니 다.중부 에서 요 소 를 제거 하면 요소 뒤의 요 소 를 모두 앞으로 옮 겨 복사 해 야 합 니 다.이것 은 좀 서 툴 러 보 입 니 다.
그러나 이러한 실현 방법 은 목록 이 색인 에 따라 값 을 추출 하고 할당 하 는 작업 이 빠 르 고 O(1)에 이 를 수 있 도록 보장 할 수 있다.이것 도 상용 과 상용 하지 않 는 조작 에 대한 절충 방안 이 라 고 할 수 있다.
list.pop()의 시간 측정 시험 은 목록 의 크기 를 바 꾸 어 두 작업 의 증가 추 세 를 테스트 합 니 다.
import timeit
pop_first = timeit.Timer("x.pop(0)", "from __main__ import x")
pop_end = timeit.Timer("x.pop()", "from __main__ import x")
print("pop(0) pop()")
y_1 = []
y_2 = []
for i in range(1000000, 10000001, 1000000):
x = list(range(i))
p_e = pop_end.timeit(number=1000)
x = list(range(i))
p_f = pop_first.timeit(number=1000)
print("{:.6f} {:.6f}".format(p_f, p_e))
y_1.append(p_f)
y_2.append(p_e)
결 과 는 다음 과 같다.시험 결 과 를 시각 화하 면 성장 추 세 를 알 수 있다.pop()은 평탄 한 상수 이 고 pop(0)은 선형 성장 추세 이다.
사전 은 목록 과 달리 키(key)에 따라 데이터 항목 을 찾 고 목록 은 색인(index)에 따라 찾 습 니 다.가장 많이 사용 되 는 수치 와 할당 값 은 모두 O(1)입 니 다.또 다른 중요 한 동작 인 contains(in)는 사전 에 어떤 키(key)가 존재 하 는 지 판단 하 는 것 이 며,이 성능 도 O(1)입 니 다.
성능 테스트 를 통 해 list 에서 값 을 검색 하고 dict 에서 값 을 검색 할 때 대비 하여 연속 값 을 포함 하 는 list 와 연속 키 키 키 를 포함 하 는 key 를 생 성 합 니 다.
dict,연산 자 in 의 시간 을 무 작위 로 검사 합 니 다.
import timeit
import random
y_1 = []
y_2 = []
print("lst_time dict_time")
for i in range(10000, 1000001, 25000):
t = timeit.Timer("random.randrange(%d) in x" % i, "from __main__ import random, x")
x = list(range(i))
lst_time = t.timeit(number=1000)
x = {j: 'k' for j in range(i)}
dict_time = t.timeit(number=1000)
print("{:.6f} {:.6f}".format(lst_time, dict_time))
y_1.append(lst_time)
y_2.append(dict_time)
결 과 는 다음 과 같다.4.567917.사전 의 집행 시간 은 규모 와 상 관 없 이 상수 임 을 알 수 있다4.567917.목록 의 실행 시간 은 목록 의 규모 가 커지 면서 선형 으로 올라간다더 많은 Python 데이터 형식 작업 복잡 도 는 공식 문 서 를 참고 할 수 있 습 니 다.
https://wiki.python.org/moin/TimeComplexity
파 이 썬 사전 과 목록 성능 간 의 비교 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 목록 과 사전 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.