>백엔드 개발 >파이썬 튜토리얼 >Python 목록 및 세트의 효율성 비교

Python 목록 및 세트의 효율성 비교

WBOY
WBOY앞으로
2023-04-12 11:13:052004검색

Python 목록 및 세트의 효율성 비교

프로그램 운영 효율

프로그램의 운영 효율성은 두 가지로 나뉘는데요, 첫째는 시간 효율성, 둘째는 공간 효율성입니다. 시간 효율성을 시간 복잡도라고 하고, 공간 효율성을 공간 복잡도라고 합니다. 시간 복잡도는 주로 프로그램의 실행 속도를 측정하는 반면, 공간 복잡도는 주로 프로그램에 필요한 추가 저장 공간을 측정합니다.

프로그램을 실행하는 데 걸리는 시간은 이론적으로 계산할 수 없습니다. 기계에서 프로그램을 실행해야만 다른 시간에 다른 기계에서 얻은 결과가 다를 수 있다는 것을 알 수 있습니다. 하지만 컴퓨터의 모든 프로그램을 테스트해야 합니까? 이는 명백히 비현실적이므로 시간 복잡도 분석 방법이 개발됩니다. 실제로 시간 복잡도를 계산할 때 반드시 정확한 실행 횟수를 계산할 필요는 없고 대략적인 실행 횟수만 계산하면 됩니다. 일반적으로 실행 횟수가 1인 경우 Big O 점근 표현을 사용합니다. 시간복잡도는 O(1)이라고 할 수 있는데, n번 걸리면 시간복잡도는 O(n)이라고 할 수 있습니다.

공간 복잡도는 알고리즘이 작동하는 동안 일시적으로 차지하는 저장 공간의 양을 측정한 것입니다. 공간 복잡도는 프로그램이 차지하는 공간이 몇 바이트인지가 아니라, 실제 작업 중에 계산하기 어렵기 때문에 공간 복잡도는 변수의 개수를 계산하는 것입니다. 공간 복잡도 계산 규칙은 기본적으로 시간 복잡도와 유사하며 Big O 점근 표기법을 사용합니다.

파이썬에서 일반적으로 사용되는 조합 데이터 유형은 튜플, 리스트, 세트 및 사전입니다. 각 데이터 유형의 다양한 작업에 대한 시간 복잡도는 Python 공식 링크

  • https에서 자세한 지침을 참조하세요. :/ /wiki.python.org/moin/TimeComplexity

튜플과 리스트는 모두 시퀀스 유형이며 저장 메커니즘은 기본적으로 동일합니다. 세트와 사전도 기본적으로 동일합니다. 유일한 차이점은 튜플의 각 요소입니다. 세트에는 해당 값이 없습니다. 다음으로, 검색 효율성과 저장 오버헤드를 확인하기 위해 세트와 목록을 예로 들어 보겠습니다.

데이터 검색 효율성

수집 효율성과 목록 데이터 검색 효율성의 격차는 얼마나 되나요? 먼저 일련의 예를 살펴보겠습니다.

import time
import random
nums = [random.randint(0, 2000000) for i in range(1000)]
list_test = list(range(1000000))
set_test = set(list_test)
count_list, count_set = 0, 0
t1 = time.time()# 测试在列表中进行查找
for num in nums:
 if num in list_test:
 count_list += 1
t2 = time.time()
for num in nums:# 测试在集合中进行查找
 if num in set_test:
 count_set += 1
t3 = time.time()# 测试在集合中进行查找
print('找到个数,列表:{},集合:{}'.format(count_list, count_set))
print('使用时间,列表:{:.4f}s'.format(t2 - t1))
print('使用时间,集合:{:.4f}s'.format(t3 - t2))

출력 결과는 다음과 같습니다.

找到个数,列表:515,集合:515
使用时间,列表:7.7953s
使用时间,集合:0.0010s

위의 예에서 세트의 검색 효율성이 목록의 검색 효율성보다 훨씬 높다는 것을 분명히 볼 수 있습니다. 따라서 다양한 애플리케이션 시나리오에서는 적절한 데이터 유형을 선택해야 하며, 적은 양의 데이터에서는 성능 차이를 볼 수 없지만, 대량의 데이터로 변경하면 그 차이가 매우 커집니다.

데이터 저장 오버헤드

세트의 검색 효율성은 목록의 검색 효율성보다 훨씬 빠릅니다. 주된 이유는 저장 원리가 다르기 때문입니다. 세트는 추가 정보를 저장하기 위해 더 많은 공간을 소비해야 합니다. 다음 getsizeof() 함수를 통해 저장 오버헤드의 차이를 살펴보겠습니다. getiszeof() 함수는 객체의 메모리 크기를 얻기 위해 Python의 sys 모듈에서 사용되는 함수입니다.

import sys
import random
list_test = list(range(1000000))
set_test = set(range(1000000))
print('列表占用大小:', sys.getsizeof(list_test))
print('集合占用大小:', sys.getsizeof(set_test))

출력 결과는 다음과 같습니다.

列表占用大小:9000112
集合占用大小:33554656

동일한 데이터 콘텐츠에 대해 컬렉션 저장 비용이 목록 비용의 몇 배에 달하는 결과를 볼 수 있습니다.

위 내용은 Python 목록 및 세트의 효율성 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제