복붙노트

[PYTHON] 파이썬에서 사전의 초기 크기를 설정하는 방법은?

PYTHON

파이썬에서 사전의 초기 크기를 설정하는 방법은?

저는 파이썬 사전에 약 4 백만 개의 다른 키를 넣을 것입니다. 이 사전을 생성하는 데 약 15 분이 걸리고 컴퓨터에서 약 4GB의 메모리를 사용합니다. 사전이 완전히 작성되면 사전을 조회하는 것이 빠릅니다.

사전이 너무 자주 재사용됨에 따라 사전 작성이 너무 많은 자원을 소비한다고 생각합니다. 일부 초기 크기 또는 버킷 번호로 파이썬에서 사전을 생성 할 수 있습니까?

내 사전은 숫자에서 개체를 가리 킵니다.

class MyObject(object):
  def __init__(self):
    # some fields...

d = {}
d[i] = MyObject()  # 4M times on different key...

해결법

  1. ==============================

    1.성능 문제로 항상 측정하는 것이 가장 좋습니다. 다음은 몇 가지 타이밍입니다.

    성능 문제로 항상 측정하는 것이 가장 좋습니다. 다음은 몇 가지 타이밍입니다.

     d = {}
     for i in xrange(4000000):
         d[i] = None
     # 722ms
    
     d = dict(itertools.izip(xrange(4000000), itertools.repeat(None)))
     # 634ms
    
     dict.fromkeys(xrange(4000000))
     # 558ms
    
     s = set(xrange(4000000))
     dict.fromkeys(s)
     # Not including set construction 353ms
    

    마지막 옵션은 크기 조정을하지 않고 단지 세트에서 해시를 복사하고 참조를 증가시킵니다. 보시다시피, 크기 조정에는 많은 시간이 걸리지 않습니다. 아마 느린 개체 생성 일 것입니다.

  2. ==============================

    2.나는 시도했다 :

    나는 시도했다 :

    a = dict.fromkeys((range(4000000)))
    

    약 3 초 만에 4 000 000 개의 항목으로 사전을 생성합니다. 그 후, 설정 값은 정말 빠릅니다. 그래서 나는 dict.fromkey가 명확히 갈 길이라고 생각합니다.

  3. ==============================

    3.C를 아는 경우 dictobject.c 및 사전 최적화에 대한 참고 사항을 살펴볼 수 있습니다. 여기에 PyDict_MINSIZE 매개 변수가 있습니다.

    C를 아는 경우 dictobject.c 및 사전 최적화에 대한 참고 사항을 살펴볼 수 있습니다. 여기에 PyDict_MINSIZE 매개 변수가 있습니다.

    이 매개 변수는 dictobject.h에 정의되어 있습니다. 그래서 파이썬을 컴파일 할 때 그것을 바꿀 수는 있지만 이것은 아마도 나쁜 생각입니다.

  4. ==============================

    4.dict.fromkeys classmethod를 사용하여 작성한 내용에서 키 해싱을 분리 할 수 ​​있습니다. 그것은 모든 값을 None 또는 원하는 값으로 기본값으로 알려진 크기의 사전을 만듭니다. 그 후에 값을 채우기 위해 반복 할 수 있습니다. 모든 키의 실제 해싱 시간을 알려줍니다. 유능한 사람이라면 속도를 크게 높일 수 있을지 확실하지 않습니다.

    dict.fromkeys classmethod를 사용하여 작성한 내용에서 키 해싱을 분리 할 수 ​​있습니다. 그것은 모든 값을 None 또는 원하는 값으로 기본값으로 알려진 크기의 사전을 만듭니다. 그 후에 값을 채우기 위해 반복 할 수 있습니다. 모든 키의 실제 해싱 시간을 알려줍니다. 유능한 사람이라면 속도를 크게 높일 수 있을지 확실하지 않습니다.

  5. ==============================

    5.귀하의 데이터가 디스크에 저장 될 수 있다면 / 아마도 BSDDB 데이터베이스에 데이터를 저장하거나 Cpickle을 사용하여 dictionary를로드 / 저장할 수 있습니다

    귀하의 데이터가 디스크에 저장 될 수 있다면 / 아마도 BSDDB 데이터베이스에 데이터를 저장하거나 Cpickle을 사용하여 dictionary를로드 / 저장할 수 있습니다

  6. ==============================

    6.같은 유형의 새로운 "빈"인스턴스로 모든 키를 초기화합니까? defaultdict 나 액세스 할 때 객체를 생성하는 것을 작성할 수 있습니까?

    같은 유형의 새로운 "빈"인스턴스로 모든 키를 초기화합니까? defaultdict 나 액세스 할 때 객체를 생성하는 것을 작성할 수 있습니까?

  7. from https://stackoverflow.com/questions/1298636/how-to-set-initial-size-for-a-dictionary-in-python by cc-by-sa and MIT license