前两个for循环查找非零元素的索引,后两个查找不同数组中值为1的元素的索引。
for s in [x for x in range(5000) if t_f_ext[0,x]!=0]:
for r in [x for x in range(400) if t_f_ext[x,s]!=0]:
J_syn=(-13.75-5.25*inh[s])
tau_r=0.2*(2-inh[s])
tau_d=2-inh[s]
I_ext[r,s]=J_syn*(tau_m[s]/(tau_d-tau_r))*(np.exp(-(i*delta_t- tau_l-t_f_ext[r,s]+1)/tau_d)-np.exp(-(i*delta_t-tau_l-t_f_ext[r,s]+1)/tau_r))
for p in [x for x in range(5000) if int_spike[x]==1]:
for q in [x for x in range(5000) if con[p,x]==1]:
k_int[q]+=1
t_f_int[np.mod((k_int[q]-1),400).astype(int),q]=i*delta_t
pr[np.mod((k_int[q]-1),400).astype(int),q]=p
答案 0 :(得分:1)
我没有要测试的数据,但我会避免使用这些结构:
[x for x in range(5000) if t_f_ext[0,x]!=0]
列表理解可能会产生一个大的列表。
如果您使用生成器,则可以避免构建列表:
(x for x in xrange(5000) if t_f_ext[0,x] != 0)
(注意对xrange
的更改。)
由于您实际上是在过滤,因此您也可以使用ifilter
中的itertools
。例如,这会过滤0到100之间的偶数:
ifilter(lambda x: x % 2 == 0, xrange(101))
另一种选择是使用这种替代结构:
for s in xrange(5000)
if t_f_ext[0,x] == 0:
continue
for r in xrange(400):
if t_f_ext[x,s] == 0:
continue
[...]
完成这些更改后,请使用cProfile
运行,以查看您的热点位置。