有没有最快的方法在python中执行For循环?

时间:2013-10-09 16:05:29

标签: python list for-loop

是否有任何最快的方法来执行以下python代码:

     L1 = [1,1,1,1,0,0]     
     L2 = [0,0,1,1,0,1]  

     D1 = [0.03,0.04,0.01,0.02,0.01,0.02]    
     D2 = [0.05,0.01,0.03,0.07,0.12,0.41]    
     a = 0
     b = 0        

     for l1,l2,d1,d2 in zip(L1,L2,D1,D2):

            if l1 == 1:      
                a += d1        
            if l2 == 1:    
                b += d2    

L1,L2,D1和D2具有相同的长度并且具有接近约4000个条目。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果速度非常重要并且您有大量这样的数字列表,那么您可以使用numpy,这将非常有用:

L1 = np.array([1,1,1,1,0,0])
L2 = np.array([0,0,1,1,0,1])

D1 = np.array([0.03,0.04,0.01,0.02,0.01,0.02])
D2 = np.array([0.05,0.01,0.03,0.07,0.12,0.41])

最快的方法是使用矢量点积:

a = np.dot(D, L)

其他方式包括D1L1中的值评估为True的值之和:

a = D1[L1.astype(bool)].sum()  
b = D2[L2.astype(bool)].sum()

或者取D1L1的产品总和:

a = np.sum(D1*L1)
b = np.sum(D2*L2)

时间安排:

L = np.random.random_integers(0,1,4000)
D = np.random.rand(4000)

In [60]: timeit np.dot(D,L)
100000 loops, best of 3: 13.1 µs per loop

In [61]: timeit np.sum(D*L)
10000 loops, best of 3: 33.7 µs per loop

In [62]: timeit D[L.astype(bool)].sum()
10000 loops, best of 3: 65 µs per loop

In [67]: %%timeit
   ....: a = 0
   ....: for l, d in zip(L, D):
   ....:     if l == 1:
   ....:         a += d
   ....: 
100 loops, best of 3: 7.68 ms per loop

答案 1 :(得分:1)

使用itertools.compress

import itertools
a = sum( itertools.compress(D1, L1) )
b = sum( itertools.compress(D2, L2) )

compress返回一个迭代器,该迭代器由第一个参数的那些元素组成,其中第二个参数的对应元素是True