Python에서 알려진 수의 요소로 목록 초기화
저는 지금 리스트를 사용하고 있는데, 다음과 같은 것을 기대하고 있었습니다.
verts = list (1000)
대신 어레이를 사용해야 합니까?
가장 먼저 떠오르는 것은 다음과 같습니다.
verts = [None]*1000
하지만 꼭 미리 초기화할 필요가 있나요?
왜 모두가 이 일을 하고 싶어 하는지 잘 모르겠습니다.여러 가지 시나리오에서 고정 사이즈의 초기화 리스트를 필요로 합니다.이러한 경우 어레이가 합리적이라고 올바르게 추론했습니다.
import array
verts=array.array('i',(0,)*1000)
비 피톤니스타를 위해(0,)*1000
term은 1000개의 0을 포함하는 태플을 작성하는 것입니다.쉼표는 python이 강제로 인식하도록 합니다.(0)
그렇지 않으면 0으로 평가됩니다.
일반적으로 오버헤드가 낮기 때문에 리스트 대신 태플을 사용했습니다.
한 가지 분명하고 효율적이지 않은 방법은
verts = [0 for x in range(1000)]
이것은 2차원까지 쉽게 확장할 수 있습니다.예를 들어, 10x100의 "어레이"를 얻으려면
verts = [[0 for x in range(100)] for y in range(10)]
고정된 크기의 배열을 초기화하는 것은 어떤 프로그래밍 언어에서도 완벽하게 받아들여질 수 있는 일입니다. 프로그래머가 중단문을 잠시(참) 루프에 넣는 것은 아닙니다.특히 많은 동적 프로그래밍 알고리즘의 경우와 같이 요소를 덮어쓰기만 하고 단순히 추가/삭제만 하는 것이 아니라면 추가 문이나 요소가 아직 초기화되지 않은지 확인하는 데 시간을 낭비하고 싶지 않을 것입니다(많은 코드 젠트).
object = [0 for x in range(1000)]
이것은 프로그래머가 달성하려고 하는 것에 효과가 있습니다.
@Steve는 이미 당신의 질문에 좋은 대답을 했습니다.
verts = [None] * 1000
경고:@Joachim Wuttke가 지적했듯이 목록은 불변의 요소로 초기화되어야 합니다. [[]] * 1000
는 1000개의 동일한 리스트(C의 같은 리스트에 대한 1000포인트 리스트와 유사)가 표시되기 때문에 예상대로 동작하지 않습니다.int, str, tuple과 같은 불변의 오브젝트도 괜찮습니다.
대체 수단
목록 크기가 느리다.다음의 결과는 그다지 놀랍지 않습니다.
>>> N = 10**6
>>> %timeit a = [None] * N
100 loops, best of 3: 7.41 ms per loop
>>> %timeit a = [None for x in xrange(N)]
10 loops, best of 3: 30 ms per loop
>>> %timeit a = [None for x in range(N)]
10 loops, best of 3: 67.7 ms per loop
>>> a = []
>>> %timeit for x in xrange(N): a.append(None)
10 loops, best of 3: 85.6 ms per loop
그러나 목록이 매우 많지 않으면 크기가 조정되는 속도가 느리지 않습니다.단일 요소로 목록을 초기화하는 대신(예:None
사이즈를 변경하는 것을 , 필요가 및 고정 길이를 사용하여 리스트의 크기를 변경할 수 없습니다.목록의 컴필레이션을 사용하여 올바른 값으로 직접 목록을 채우는 것을 검토해 주십시오.예를 들어 다음과 같습니다.
>>> %timeit a = [x**2 for x in xrange(N)]
10 loops, best of 3: 109 ms per loop
>>> def fill_list1():
"""Not too bad, but complicated code"""
a = [None] * N
for x in xrange(N):
a[x] = x**2
>>> %timeit fill_list1()
10 loops, best of 3: 126 ms per loop
>>> def fill_list2():
"""This is slow, use only for small lists"""
a = []
for x in xrange(N):
a.append(x**2)
>>> %timeit fill_list2()
10 loops, best of 3: 177 ms per loop
numpy와 비교
대용량 데이터 세트 numpy 또는 기타 최적화된 라이브러리의 경우 다음과 같이 훨씬 빠릅니다.
from numpy import ndarray, zeros
%timeit empty((N,))
1000000 loops, best of 3: 788 ns per loop
%timeit zeros((N,))
100 loops, best of 3: 3.56 ms per loop
다음과 같이 할 수 있습니다.
verts = list(xrange(1000))
그러면 크기가 1000개인 요소의 목록이 표시되며 0 ~999의 값으로 초기화됩니다.~로list
하다__len__
우선 새로운 리스트를 사이징하는 것은 꽤 효율적일 것입니다.
, 「마음대로」를 해 주세요.dict
를 입력합니다.사전 검색 비용은 작고 임의 목록 요소에 액세스하는 비용과 비슷합니다.
또한 매핑을 사용할 때 다음과 같이 쓸 수 있습니다.
aDict = {}
aDict[100] = fetchElement()
putElement(fetchElement(), fetchPosition(), aDict)
★★★★★★★★★★★★★★★★.putElement
함수는 지정된 위치에 항목을 저장할 수 있습니다.또한 컬렉션에 지정된 인덱스에 요소가 포함되어 있는지 확인해야 할 경우 다음과 같이 쓰는 것이 더 좋습니다.
if anIndex in aDict:
print "cool!"
대상:
if not myList[anIndex] is None:
print "cool!"
후자는 컬렉션에서 실제 요소는 사용할 수 없다고 가정하기 때문입니다.None
이 경우 코드가 잘못 동작합니다.
그리고 퍼포먼스가 절실히 필요한 경우 변수를 미리 초기화하고 가능한 한 빠른 코드를 작성하려고 하면 언어를 변경하십시오.가장 빠른 코드는 Python으로 쓸 수 없습니다.대신 C를 시도하고 Python에서 사전 초기화 및 사전 컴파일된 코드를 호출하기 위해 래퍼를 구현해야 합니다.
문제 영역에 대해 자세히 알지 못하면 질문에 답하기가 어렵습니다.추가 작업이 필요한 경우를 제외하고 목록을 초기화하는 방법은 다음과 같습니다.
verts = [ ]
실제로 성능 문제가 발생하고 있습니까?그렇다면 성능 병목현상은 무엇입니까?없는 문제를 해결하려고 하지 마세요.어레이를 1000개의 요소로 동적으로 채우기 위한 퍼포먼스 비용은 실제로 작성하려는 프로그램과 전혀 관련이 없을 수 있습니다.
배열 클래스는 목록에 있는 항목이 항상 특정 원시 고정 길이 유형(예: char, int, float)인 경우에 유용합니다.그러나 사전 초기화가 필요하지 않습니다.
이것은, 다음과 같습니다.
lst = [8 for i in range(9)]
리스트 작성, 요소 초기화 8
단, 이것은 다음과 같습니다.
lst = [0] * 7
1개의 요소를 가진 7개의 목록을 만듭니다.
언급URL : https://stackoverflow.com/questions/521674/initializing-a-list-to-a-known-number-of-elements-in-python
'programing' 카테고리의 다른 글
개체 유형의 이름을 가져옵니다. (0) | 2022.10.27 |
---|---|
org.w3c.dom을 변환하려면 어떻게 해야 하나요?개체를 문자열에 문서화하시겠습니까? (0) | 2022.10.27 |
문자열 배열을 java.util로 변환하고 있습니다.목록. (0) | 2022.10.27 |
정수 접미사 J는 무슨 뜻입니까? (0) | 2022.10.27 |
PHP에서 $array[] = $value와 array_sarray, $value 중 어느 쪽이 더 빠릅니까? (0) | 2022.10.27 |