我的代碼需要大約兩個小時來處理。瓶頸是for循環,如果 聲明(請參閱代碼中的註釋)。 我是初學者與蟒蛇:)任何人都可以推薦一種高效的Python方法來替換嵌套和if語句?關於在我的代碼中加快/ if語句的建議?
我有〜3000萬行的表,每一行與(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值的最終計數。例如:
20.0 11.3 7 7
21.0 11.3 0 10
22.0 11.3 3 1
...
這裏只有大約600獨特的座標,所以輸出表將被600x4。 我的代碼:
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。 編輯2: @Ophion和@Sibster感謝您的建議,我沒有足夠的信用+1 +1有用的答案。
是3千萬行真的很棒保存在TXT?你不應該看一些更復雜的格式來保存(並讀入)你的數據嗎?此外,我建議儘可能向量化(numpy),因爲這會將for-loops推入numpy,這是C(因此更快) – usethedeathstar