这是一个任务说明: 我有2d阵列NxM,N,M <1000,并且存在K(K <100000)组坐标(x1,x2,y1,y2)。我需要将矩形(x1,x2,y1,y2)中的所有元素相加 我的代码有效但我需要让它更快,因为最大的测试不能在所需的时间内工作。
这是:
def build_y(cx, fx, lx, cy, fy, ly):
if fy == ly:
if fx == lx:
t[cx][cy] = a[fx][fy]
else:
t[cx][cy] = t[cx*2][cy] + t[cx*2+1][cy];
else:
my = int((fy + ly) / 2)
build_y (cx, fx, lx, cy*2, fy, my)
build_y (cx, fx, lx, cy*2+1, my+1, ly)
t[cx][cy] = t[cx][cy*2] + t[cx][cy*2+1]
def build_x(cx, fx, lx):
if fx != lx:
mx = int((fx + lx) / 2)
build_x (cx*2, fx, mx)
build_x (cx*2+1, mx+1, lx)
build_y (cx, fx, lx, 1, 0, m-1)
def sum_y (cx, cy, tfy, tly, fy, ly):
if fy > ly:
return 0
if fy == tfy and tly == ly:
return t[cx][cy]
tmy = int((tfy + tly) / 2)
return sum_y(cx, cy*2, tfy, tmy, fy, min(ly, tmy)) + sum_y(cx, cy*2+1, tmy+1, tly, max(fy, tmy+1), ly)
def sum_x(cx, tfx, tlx, fx, lx, fy, ly):
if fx > lx:
return 0
if fx == tfx and tlx == lx:
return sum_y(cx, 1, 0, m-1, fy, ly)
tmx = int((tfx + tlx) / 2)
return sum_x(cx*2, tfx, tmx, fx, min(lx, tmx), fy, ly) + sum_x(cx*2+1, tmx+1, tlx, max(fx, tmx+1), lx, fy, ly)
fin = open('input.txt', 'r').read().split()
n = int(fin[0])
m = int(fin[1])
k = int(fin[2])
a = []
b = []
t = [0]*3*n
for i in range(3*n):
t[i] = [0]*3*m
for i in range(n):
a.append([int(j) for j in fin[3+i*m:3+i*m+m]])
build_x(1, 0, n-1)
for i in range(k):
b.append([int(j) for j in fin [3+n*m+4*i:3+n*m+4*i+4]])
for i in range(k):
print(sum_x(1, 0, n-1, b[i][0]-1, b[i][2]-1, b[i][1]-1, b[i][3]-1))
答案 0 :(得分:0)
使用numpy并将所有列表重写为numpy数组,例如t[cx][cy] = a[fx][fy]
在将t[cx,cy] = a[fx,fy]
初始化为numpy数组后变为t, a
。你可以简单地获得100倍的加速。事实上,numpy操作比列表操作要快得多,所以如果你有很多这样的操作,那么使用numpy是非常合适的。