@ EriF89를 보여주는 새로운 테스트 세트는이 세월이 지난 후에도 여전히 옳습니다.
$ python -m timeit -s "l={k:k for k in xrange(5000)}" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.84 msec per loop
$ python -m timeit -s "l=[k for k in xrange(5000)]" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 573 msec per loop
$ python -m timeit -s "l=tuple([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 587 msec per loop
$ python -m timeit -s "l=set([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.88 msec per loop
여기서는 일부 사용 사례에서 tuple
보다 빠르며 lists
메모리를 적게 사용 하는 것으로 알려진을 비교합니다 . 조회 테이블의 경우tuple
공정하지 않습니다.
모두 dict
와set
아주 잘 수행. 이것은 고유성에 대한 @SilentGhost 답변과 관련이있는 흥미로운 점을 제시합니다. OP에 데이터 세트에 10M 값이 있고 중복 된 값이 있는지 알 수없는 경우 요소의 세트 / dict를 병렬로 유지할 가치가 있습니다. 실제 데이터 세트 및 해당 세트 / dict에 존재하는지 테스트합니다. 10M 데이터 포인트는 10 개의 고유 한 값만 가질 수 있으며, 이는 검색 할 공간이 훨씬 작습니다!
dicts에 대한 SilentGhost의 실수는 실제로 dict을 사용하여 중복 된 데이터 (값)를 중복되지 않은 세트 (키)와 상관시켜 하나의 데이터 오브젝트를 유지하여 모든 데이터를 보유 할 수 있지만 여전히 룩업 테이블처럼 빠르기 때문입니다. 예를 들어, dict 키는 조회되는 값일 수 있으며 값은 해당 값이 발생한 가상 목록의 색인 목록 일 수 있습니다.
예를 들어, 검색 할 소스 데이터 목록이 l=[1,2,3,1,2,1,4]
인 경우 검색 및 메모리를이 dict로 바꾸어 검색 및 메모리 모두에 대해 최적화 할 수 있습니다.
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> l=[1,2,3,1,2,1,4]
>>> for i, e in enumerate(l):
... d[e].append(i)
>>> d
defaultdict(<class 'list'>, {1: [0, 3, 5], 2: [1, 4], 3: [2], 4: [6]})
이 구술을 통해 다음을 알 수 있습니다.
- 경우 값이 원본 데이터 셋에 있었다 (즉,
2 in d
반환 True
)
- 어디 값이 원본 데이터 셋에 있었다 (즉
d[2]
데이터가 원본 데이터 목록에서 발견 된 인덱스의 목록을 반환합니다 [1, 4]
)