回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有下面的代码,它应该对一个数据向量做一些运算并存储结果,我的问题是,当我开始运行这段代码时,每次迭代(每个outter循环)大约需要12秒,但经过一段时间后,迭代的时间在结束时变得更长,每次迭代需要2分钟才能完成,我想知道出了什么问题用我的密码?这与我保存的内存大小和数组大小有关吗?如果是,我怎么解决?如果没有,有什么问题?在</p>
<p><code>allclassifiers</code>是2D向量:<code>allclassifiers.shape = tuple: (1020, 1629)</code>这意味着my for应该循环1629次,每次对大小为1020的向量执行操作,每个向量都是数组0或1s</p>
<p>最后,<code>points_comb</code>的大小约为400MB,<code>points_comb.shape = tuple: (26538039, 2)</code>,我必须指出我在一个有4GB RAM的系统上运行代码。<br/>
<code>valid_list</code>是0和1的向量,大小为1020,<code>valid_list.shape tuple: (1020,)</code></p>
<pre><code>startTime = datetime.now()
for i in range(allclassifiers.shape[1]):
for j in range(allclassifiers.shape[1]):
rs_t = combine_crisp(valid_list, allclassifiers[:,i], allclassifiers[:,j], boolean_function)
fpr_tmp, tpr_tmp = resp2pts(valid_list, rs_t)
points_comb = np.vstack((points_comb,np.hstack((fpr_tmp, tpr_tmp))))
endTime = datetime.now()
executionTime = endTime - startTime
print "Combination for classifier: " + str(i)+ ' ' + str(executionTime.seconds / 60) + " minutes and " + str((executionTime.seconds) - ((executionTime.seconds / 60)*60)) +" seconds"
def combine_crisp(lab, r_1, r_2, fun):
rs = np.empty([len(lab), len(fun)])
k = 0
for b in fun:
if b == 1: #----------------> 'A AND B'
r12 = np.logical_and(r_1, r_2)
elif b == 2: #----------------> 'NOT A AND B'
r12 = np.logical_not(np.logical_and(r_1, r_2))
elif b == 3: #----------------> 'A AND NOT B'
r12 = np.logical_and(r_1, np.logical_not (r_2))
elif b == 4: #----------------> 'A NAND B'
r12 = np.logical_not( (np.logical_and(r_1, r_2)))
elif b == 5: #----------------> 'A OR B'
r12 = np.logical_or(r_1, r_2)
elif b == 6: #----------------> 'NOT A OR B'; 'A IMP B'
r12 = np.logical_not (np.logical_or(r_1, r_2))
elif b == 7: #----------------> 'A OR NOT B' ;'B IMP A'
r12 = np.logical_or(r_1, np.logical_not (r_2))
elif b == 8: #----------------> 'A NOR B'
r12 = np.logical_not( (np.logical_or(r_1, r_2)))
elif b == 9: #----------------> 'A XOR B'
r12 = np.logical_xor(r_1, r_2)
elif b == 10: #----------------> 'A EQV B'
r12 = np.logical_not (np.logical_xor(r_1, r_2))
else:
print('Unknown Boolean function')
rs[:, k] = r12
k = k + 1
return rs
def resp2pts(lab, resp):
lab = lab > 0
resp = resp > 0
P = sum(lab)
N = sum(~lab)
if resp.ndim == 1:
num_pts = 1
tp = sum(lab[resp])
fp = sum(~lab[resp])
else:
num_pts = resp.shape[1]
tp = np.empty([num_pts,1])
fp = np.empty([num_pts,1])
for i in np.arange(num_pts):
tp[i] = np.sum( lab[resp[:,i]])
fp[i] = np.sum( ~lab[resp[:,i]])
tp = np.true_divide(tp,P)
fp = np.true_divide(fp,N)
return fp, tp
</code></pre>