[python] 파이썬 세트와리스트

파이썬에서 어떤 데이터 구조가 더 효율적 / 빠른가? 그 순서가 나에게 중요하지 않다고 가정하고 어쨌든 중복을 확인하려고한다면 파이썬이 파이썬 목록보다 느리게 설정됩니까?



답변

그것은 당신이 그것을하려는 의도에 달려 있습니다.

세트에 객체가 있는지 여부를 판별 할 때 세트가 상당히 빠르지 x in s만 컨텐츠를 반복 할 때 목록보다 속도가 느립니다.

timeit 모듈 을 사용 하여 상황에 맞는 것이 더 빠른지 확인할 수 있습니다.


답변

값을 반복하려는 경우 목록이 세트보다 약간 빠릅니다.

그러나 항목이 포함되어 있는지 확인하려는 경우 세트가 목록보다 훨씬 빠릅니다. 그러나 고유 한 항목 만 포함 할 수 있습니다.

튜플은 불변성을 제외하고 목록과 거의 동일한 방식으로 수행됩니다.

반복

>>> 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


답변

목록 성능 :

>>> 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

Tuple 은 목록과 비슷하지만 수정할 수 없으므로 Tuple 을 고려할 수 있습니다. 메모리를 약간 덜 차지하고 액세스 속도가 더 빠릅니다. 융통성이 없지만 목록보다 효율적입니다. 일반적인 용도는 사전 키 역할을하는 것입니다.

세트는 또한 시퀀스 구조이지만 목록과 튜플과는 두 가지 차이점이 있습니다. 세트에는 순서가 있지만 순서는 임의적이며 프로그래머가 제어하지 않습니다. 두 번째 차이점은 세트의 요소가 고유해야한다는 것입니다.

set정의에 의해. [ 파이썬 | 위키 ].

>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}


답변

Set거의 즉각적인 ‘포함’점검으로 인해 승리 : https://en.wikipedia.org/wiki/Hash_table

목록 구현 : 일반적으로 금속에 가까운 낮은 수준의 배열로, 반복 및 요소 인덱스 별 임의 액세스에 적합합니다.

구현 설정 : https://en.wikipedia.org/wiki/Hash_table , 목록에서 반복하지 않지만 키에서 해시 를 계산하여 요소를 찾으 므로 키 요소의 특성과 해시에 따라 다릅니다. 함수. dict에 사용되는 것과 유사합니다. 내가 의심 list당신은 매우 몇 가지 요소 (<5)이있는 경우 더 빨리 될 수있다, 더 큰 요소는 더 카운트 setA가 수표를 포함하기위한 수행합니다. 또한 요소 추가 및 제거가 빠릅니다. 또한 세트를 만드는 데 비용이 든다는 사실을 항상 명심하십시오!

참고 : list가 이미 정렬되어 있으면 검색 list이 매우 빠를 수 있지만 일반적인 경우 set에는 포함 검사가 더 빠르고 간단합니다.


답변

tl; dr

그들은 기본적 의미 데이터에 대한 작업을 수행하는 데 사용되기 때문에 데이터 구조 (DS)가 중요하다 : 약간의 입력을 받아 , 그것을 처리출력을 돌려주고 .

일부 데이터 구조는 특정 경우에 다른 데이터 구조보다 유용합니다. 따라서 어떤 (DS)가 더 효율적 / 빠른지 묻는 것은 불공평합니다. 나이프와 포크 사이에서 어떤 도구가 더 효율적인지 묻는 것과 같습니다. 나는 모든 상황에 달려 있습니다.

기울기

목록은 변경 가능한 순서 이며 일반적으로 동종 항목의 컬렉션을 저장하는 데 사용됩니다 .

세트

집합 객체는 고유 한 해시 가능 객체정렬되지 않은 모음입니다 . 일반적으로 멤버십을 테스트하고 시퀀스에서 중복을 제거하고 교점, 합집합, 차이 및 대칭 차이와 같은 수학 연산을 계산하는 데 사용됩니다.

용법

일부 답변에서 값을 반복 할 때 목록이 세트보다 훨씬 빠릅니다. 반면에 항목이 포함되어 있는지 확인할 때 목록보다 세트가 더 빠릅니다. 따라서 말할 수있는 유일한 것은 목록이 특정 작업에 대한 집합보다 낫다는 것입니다.


답변

값이 소수의 리터럴 중 하나인지 CPython을 사용하여 확인할 때 결과에 ​​관심이있었습니다. set대 파이썬 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에서는 set항상 느립니다. or2 ~ 3 리터 가장 빠른, 그리고 tuple하고 list있습니다 빠른 4 개 이상 리터럴. tuple대 속도를 구분할 수 없었습니다 list.

테스트 할 값이 루프 내에서 리터럴을 생성하는 대신 함수 외부의 전역 변수에 캐시되면 setPython 2에서도 매번 승리했습니다.

이 결과는 Core i7의 64 비트 CPython에 적용됩니다.


답변

유스 케이스가 존재를 참조하거나 검색하는 데 제한이있는 Set 구현과 유스 케이스가 반복을 수행 해야하는 Tuple 구현을 권장합니다. 목록은 저수준 구현이며 상당한 메모리 오버 헤드가 필요합니다.