it-source

Python 집합과 목록

criticalcode 2023. 1. 13. 19:51
반응형

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

은 목록과 유사하지만 수정할 수 없으므로 고려할 수 있습니다.메모리를 조금 적게 사용하고, 액세스도 고속입니다.유연하지는 않지만 목록보다 효율적입니다.일반적으로 사전 키 역할을 합니다.

세트도 시퀀스 구조이지만 리스트 및 튜플과는 두 가지 차이가 있습니다.집합에는 순서가 있지만, 그 순서는 임의이며 프로그래머가 제어할 수 없습니다.두 번째 차이점은 세트의 요소가 고유해야 한다는 것입니다.

set정의상.[http | wiki]

>>> 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 ★★★★★★★★★★★★★★★★★」list4월 4일를 수 없었다tuple »list.

에 캐시된 하는 것이 , " " " " " " " " " 입니다.setPython 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

반응형