我的代码需要大约两个小时来处理。瓶颈在于 for 循环和 if 语句(参见代码中的注释)。我是 python 的初学者 :) 任何人都可以推荐一种有效的 python 方法来替换嵌套的 for 和 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 的方法以 1 分 26 秒计算。我原来的方法,同一台计算机,相同的数据文件,106m23s。 编辑2 : @Ophion 和@Sibster 感谢您的建议,我没有足够的信用来 +1 有用的答案。