Python 집합과 목록
Python에서 어떤 데이터 구조가 더 효율적이고 빠릅니까?그 순서는 저에게 중요하지 않고 중복되는 것을 확인하고 있다고 가정한다면, Python 세트가 Python 목록보다 느린가요?
그것은 당신이 그것을 가지고 무엇을 할 것인가에 달려 있다.
할 때 예: '세트는 매우 빠릅니다).x in s
그 되어 있지 않기 과 같이 수 없습니다.세트는 실제로 반복하는 데 다소 느립니다.
타임잇 모듈을 사용하여 어떤 것이 사용자의 상황에 더 빠른지 확인할 수 있습니다.
값만 반복하는 경우 목록이 세트보다 약간 빠릅니다.
그러나 항목이 포함되어 있는지 확인하려면 세트가 목록보다 훨씬 빠릅니다.단, 고유한 항목만 포함할 수 있습니다.
튜플은 불변성을 제외하고는 목록과 거의 동일한 방식으로 동작하는 것으로 나타났습니다.
반복
>>> def iter_test(iterable):
... for i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = set(range(10000))",
... number=100000)
12.666952133178711
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = list(range(10000))",
... number=100000)
9.917098999023438
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = tuple(range(10000))",
... number=100000)
9.865639209747314
오브젝트가 존재하는지 확인합니다.
>>> def in_test(iterable):
... for i in range(1000):
... if i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = set(range(1000))",
... number=10000)
0.5591847896575928
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = list(range(1000))",
... number=10000)
50.18339991569519
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = tuple(range(1000))",
... number=10000)
51.597304821014404
Set
거의 즉각적인 '확실한' 체크로 승리: https://en.wikipedia.org/wiki/Hash_table
리스트 실장: 보통 금속에 가까운 낮은 레벨의 어레이로 반복 및 요소 인덱스에 의한 랜덤 액세스에 적합합니다.
Set implementation : https://en.wikipedia.org/wiki/Hash_table, 목록 상에서 반복하지 않고 키에서 해시를 계산하여 요소를 찾기 때문에 키 요소 및 해시 함수의 특성에 따라 달라집니다.dict에 사용되는 것과 유사합니다.내 생각엔list
더 수 (< 5).★★★★★★★★★★★★★★★★★,set
는 포함 체크에 대해 수행됩니다.을 사용하다에는 비용이 든다는 잊지 !
주의: 만약list
되어 있습니다.list
리스트에서는 이지만, 보다 가 있는 경우, 「」는 「」를 참조해 주세요.set
가 포함된 체크가 더 빠릅니다.
퍼포먼스 리스트:
>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608
퍼포먼스 설정:
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661
탭은 목록과 유사하지만 수정할 수 없으므로 고려할 수 있습니다.메모리를 조금 적게 사용하고, 액세스도 고속입니다.유연하지는 않지만 목록보다 효율적입니다.일반적으로 사전 키 역할을 합니다.
세트도 시퀀스 구조이지만 리스트 및 튜플과는 두 가지 차이가 있습니다.집합에는 순서가 있지만, 그 순서는 임의이며 프로그래머가 제어할 수 없습니다.두 번째 차이점은 세트의 요소가 고유해야 한다는 것입니다.
>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
dr;dr
데이터 구조(DS)는 데이터에 대한 작업을 수행하기 위해 사용되기 때문에 중요합니다.데이터 구조(DS)는 기본적으로 일부 입력을 받고 처리한 후 출력을 반환합니다.
일부 데이터 구조는 특정 경우에 다른 데이터 구조보다 더 유용합니다.따라서 어떤 (DS)가 더 효율적이고 빠른지 묻는 것은 매우 불공평합니다.나이프와 포크 중 어떤 도구가 더 효과적인지 묻는 것과 같다.내 말은 모든 것은 상황에 따라 달라.
리스트
목록은 일반적으로 동종 항목의 집합을 저장하는 데 사용되는 가변 시퀀스입니다.
놓다
집합 개체는 개별 해시 가능 개체의 순서가 정렬되지 않은 모음입니다.멤버쉽을 테스트하고, 수열에서 중복을 제거하고, 교차점, 합집합, 차이 및 대칭 차이와 같은 수학적 연산을 계산하는 데 일반적으로 사용됩니다.
사용.
일부 답변을 보면 값을 반복할 때 목록이 세트보다 상당히 빠르다는 것을 알 수 있습니다.한편, 항목이 포함되어 있는지 확인할 때 세트가 목록보다 빠릅니다.따라서 리스트가 특정 조작의 세트보다 낫다고 말할 수 있는 것은 그 반대뿐입니다.
CPython을 통해 값이 소수 리터럴 중 하나인지 확인할 때 결과에 관심이 있었습니다. set
3 Python 3 †에서tuple
,list
★★★★★★★★★★★★★★★★★」or
:
from timeit import timeit
def in_test1():
for i in range(1000):
if i in (314, 628):
pass
def in_test2():
for i in range(1000):
if i in [314, 628]:
pass
def in_test3():
for i in range(1000):
if i in {314, 628}:
pass
def in_test4():
for i in range(1000):
if i == 314 or i == 628:
pass
print("tuple")
print(timeit("in_test1()", setup="from __main__ import in_test1", number=100000))
print("list")
print(timeit("in_test2()", setup="from __main__ import in_test2", number=100000))
print("set")
print(timeit("in_test3()", setup="from __main__ import in_test3", number=100000))
print("or")
print(timeit("in_test4()", setup="from __main__ import in_test4", number=100000))
출력:
tuple
4.735646052286029
list
4.7308746771886945
set
3.5755991376936436
or
4.687681658193469
3~5리터일 경우set
.or
가장 느려집니다.
2, Python 2의 set
항상 가장 느리다. or
, 리터럴이 2~3리터면 됩니다.tuple
★★★★★★★★★★★★★★★★★」list
4월 4일를 수 없었다tuple
»list
.
에 캐시된 하는 것이 , " " " " " " " " " 입니다.set
Python 2는 Python 2입니다.
이러한 결과는 Core i7의 64비트 CPython에 적용됩니다.
세트 속도가 빨라지고 세트 기능이 많아집니다.예를 들어, 2개의 세트가 있다고 합시다.
set1 = {"Harry Potter", "James Bond", "Iron Man"}
set2 = {"Captain America", "Black Widow", "Hulk", "Harry Potter", "James Bond"}
2종류의 세트를 간단하게 결합할 수 있습니다.
set3 = set1.union(set2)
양쪽의 공통점을 소개합니다.
set3 = set1.intersection(set2)
다음 두 가지 차이점에 대해 알아보십시오.
set3 = set1.difference(set2)
그리고 더 많이!한번 써보세요, 재미있어요!또, 2개의 리스트내의 다른 값이나 2개의 리스트내의 공통의 값에 대해 작업을 실시할 필요가 있는 경우, 저는 당신의 리스트를 세트로 변환하는 것을 선호하며, 많은 프로그래머들이 그렇게 하고 있습니다.도움이 되길 바랍니다:-)
사용 사례가 참조 또는 존재 검색으로 제한되는 Set 구현과 반복 수행이 필요한 Tuple 구현을 권장합니다.목록은 낮은 수준의 구현이며 상당한 메모리 오버헤드가 필요합니다.
from datetime import datetime
listA = range(10000000)
setA = set(listA)
tupA = tuple(listA)
#Source Code
def calc(data, type):
start = datetime.now()
if data in type:
print ""
end = datetime.now()
print end-start
calc(9999, listA)
calc(9999, tupA)
calc(9999, setA)
3회 모두 10회 반복 비교 후 출력 : 비교
@Ellis Percival의 테스트와 같은 맥락으로 요소 추가 시 세트와 같은 방식으로 목록이 수행된다는 것을 추가하고 싶습니다.
요소 추가
>>> def add_test_set(iterable):
... for i in range(10000):
... iterable.add(i)
...
>>> def add_test_list(iterable):
... for i in range(10000):
... iterable.append(i)
...
>>> timeit("add_test_set(iterable)",
... setup="from __main__ import add_test_set; iterable = set()",
... number=10000)
7.073143866999999
>>> timeit("add_test_list(iterable)",
... setup="from __main__ import add_test_list; iterable = list()",
... number=10000)
6.80650725000001
(이것을 포함하도록 그의 투고를 편집하려고 했는데 편집큐가 꽉 찼습니다)
언급URL : https://stackoverflow.com/questions/2831212/python-sets-vs-lists
'it-source' 카테고리의 다른 글
Intelij IDEA가 크래쉬하여 오류가 발생하였습니다. (0) | 2023.01.13 |
---|---|
Java Byte[] 어레이 비교 방법 (0) | 2023.01.13 |
개체 목록에 대한 vuex 저장소를 구성하고 ID를 기반으로 개체 목록에 개별적으로 매핑하는 방법 (0) | 2023.01.13 |
여러 요소를 배열에 푸시 (0) | 2023.01.13 |
PHP의 숫자 기호를 변경하시겠습니까? (0) | 2023.01.13 |