코드 처리에 약 2 시간이 걸립니다. 병목 현상은 for 루프에 있고 문장 인 경우 (코드의 주석 참조) 저는 파이썬으로 초급자입니다. 누군가가 중첩 된 for 및 if 문을 대체 할 효율적인 파이썬 방법을 추천 할 수 있습니까?내 코드에서 더 빠른 for/if 문에 대한 제안 사항?
나는 ~ 30,000,000 열의 테이블이, (X, Y, Z) 값을 각 행 :
20.0 11.3 7
21.0 11.3 0
22.0 11.3 3
...
원하는 출력은 x, y, min (z), count (min (z)) 형식의 테이블입니다. 마지막 열은 그 (x, y)에서 최소 z 값의 최종 개수입니다. 예 :
22.0 11.3 3 1
20.0 11.3 7 7
가 약 600 독특한 좌표, 그래서 출력 테이블은 600x4한다
21.0 11.3 0 10 ...
. 내 코드 :
import numpy as np
file = open('input.txt','r');
coordset = set()
data = np.zeros((600,4))*np.nan
irow = 0
ctr = 0
for row in file:
item = row.split()
x = float(item[0])
y = float(item[1])
z = float(item[2])
# build unique grid of coords
if ((x,y)) not in coordset:
data[irow][0] = x
data[irow][1] = y
data[irow][2] = z
irow = irow + 1 # grows up to 599
# lookup table of unique coords
coordset.add((x,y))
# BOTTLENECK. replace ifs? for?
for i in range(0, irow):
if data[i][0]==x and data[i][1]==y:
if z > data[i][2]:
continue
elif z==data[i][2]:
ctr = ctr + 1
data[i][3]=ctr
if z < data[i][2]:
data[i][2] = z
ctr = 1
data[i][3]=ctr
편집 : 참고로는 @Joowani에 의한 접근 방식은 1m26s에서 계산합니다. 내 원래의 접근 방식, 같은 컴퓨터, 동일한 데이터 파일, 106m23s. edit2 : @Ophion 및 @Sibster 제안에 감사드립니다. 유용한 답변을 +1 할만한 충분한 점수가 없습니다.
은 txt로 저장하려면 30million 행 정말입니까? 데이터를 저장하고 읽을 수있는 좀 더 정교한 형식을 찾아야합니까? 또한 그 때부터 numpy, for 루프를 푸시하기 때문에 가능할 때마다 벡터화 (numpy)를 제안합니다. 따라서 C (따라서 더 빠름) – usethedeathstar