寻找满足一定条件的矩阵索引的耗时循环

2024-06-18 17:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

前两个for循环查找非零元素的索引,后两个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 

Tags: inmod元素forifnprange数组
1条回答
网友
1楼 · 发布于 2024-06-18 17:44:40

我没有要测试的数据,但我会避免这些构造:

[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的更改。)

因为本质上是过滤,所以也可以使用来自itertoolsifilter。例如,这会过滤从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运行它,看看你的热点在哪里。你知道吗

相关问题 更多 >