2016-06-14 14 views
-3

最初の2つのforループは、非ゼロ要素のインデックスを見つけ、最後の2つは、異なる配列の値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 
+1

ベンチマーク時は何ですか?xrange()のrange()を交換することを検討しましたか?動機付けについては、https://wiki.python.org/moin/ForLoopを参照してください。 – vielmetti

答えて

1

私がテストするためにあなたのデータを持っていないが、私はこれらの構造を避けるだろう:

[x for x in range(5000) if t_f_ext[0,x]!=0] 

リストの内包が、おそらく大規模なリストを生成することができること。

あなたの代わりに発電機を使用する場合は、リストの構築を避けることができます(。同様xrangeへの変更に注意してください)あなたは、本質的に

(x for x in xrange(5000) if t_f_ext[0,x] != 0) 

をフィルタリングしているので、あなたも可能性itertoolsからifilterを使用してください。たとえば、これは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でそれを実行しますホットスポットはあります。

関連する問題