파이썬에서 특정 크기의 목록을 만드는 방법

  1. 리스트를위한 사전 할당 저장소
  2. 다른 순차 데이터 구조를위한 사전 할당 스토리지

목록 또는 배열에 대한 사전 할당 스토리지는 프로그래머에게 일반적인 패턴입니다. 그들이 요소의 수를 미리 알 때.

C++ 및 Java 와 달리 Python 에서는 사전 할당 된 모든 저장소를 일부 값으로 초기화해야합니다. 일반적으로 개발자는None,'',False0 과 같은 목적으로 잘못된 값을 사용합니다.

파이썬은 고정 된 크기의 목록을 만드는 여러 가지 방법을 제공합니다. 다른 성능 특성.

다른 접근 방식의 성능을 비교하기 위해 Python 의 표준을 사용합니다. 모듈 timeit. 작은 파이썬 코드의 실행 시간을 측정하는 편리한 방법을 제공합니다.

리스트를위한 사전 할당 저장소

*연산자를 사용하는 첫 번째이자 가장 빠른 방법은 지정된 목록을 반복합니다. 횟수.

>>> [None] * 10
[None, None, None, None, None, None, None, None, None, None]

백만 번의 반복 ( timeit에서 반복의 기본값)은 대략 117ms

>>> timeit("[None] * 10")
0.11655918900214601

또 다른 방법은 목록 이해와 함께 range 내장 함수를 사용하는 것입니다.

>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]

거의 6 배 더 느리고 백만 회당 612ms 가 걸립니다.

>>> timeit("[None for _ in range(10)]")
0.6115895550028654

세 번째 방법은 간단한 for 루프를 list.append()와 함께 사용하는 것입니다.

>>> a = []
>>> for _ in range(10):
...   a.append(None)
...
>>> a
[None, None, None, None, None, None, None, None, None, None]

루프를 사용하는 것이 가장 느린 방법이며 백만 회 반복을 완료하는 데 842ms 가 걸립니다.

>>> timeit("for _ in range(10): a.append(None)", setup="a=[]")
0.8420009529945673

다른 순차 데이터 구조를위한 사전 할당 스토리지

순차 데이터 구조를위한 스토리지를 사전 할당하므로 array 내장 데이터를 사용하는 것이 좋습니다. 목록 대신 구조.

>>> from array import array
>>> array('i',(0,)*10)
array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

아래에서 볼 수 있듯이이 접근법은[None] * 10 다음으로 두 번째로 빠릅니다.

>>> timeit("array('i',(0,)*10)", setup="from array import array")
0.4557597979946877

위의 순수한 파이썬 접근법을 과학 컴퓨팅을위한 NumPy 파이썬 패키지와 비교해 보자.

>>> from numpy import empty
>>> empty(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

NumPy 방식은 백만 회당 589ms 가 소요됩니다.

>>> timeit("empty(10)", setup="from numpy import empty")
0.5890094790011062

그러나 NumPy 방식은 더 큰 목록의 경우 훨씬 빠릅니다.

>>> timeit("[None]*10000")
16.059584009999526
>>> timeit("empty(10000)", setup="from numpy import empty")
1.1065983309963485

결론은 작은 목록에 대해서는 [None] * 10 을 고수하는 것이 가장 좋지만 더 큰 순차적 데이터를 처리 할 때 NumPy 의 empty()에.

관련 문장 - Python List

  • Python의 목록에서 항목을 무작위로 선택하는 방법
  • comments powered by Disqus