파이썬에서 특정 크기의 목록을 만드는 방법
목록 또는 배열에 대한 사전 할당 스토리지는 프로그래머에게 일반적인 패턴입니다.
그들이 요소의 수를 미리 알 때.
C++ 및 Java 와 달리 Python 에서는 사전 할당 된 모든 저장소를 일부 값으로 초기화해야합니다. 일반적으로 개발자는None
,''
,False
및 0
과 같은 목적으로 잘못된 값을 사용합니다.
파이썬은 고정 된 크기의 목록을 만드는 여러 가지 방법을 제공합니다.
다른 성능 특성.
다른 접근 방식의 성능을 비교하기 위해 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()
에.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook