是否有任何最快的方法来执行以下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个条目。
谢谢!
答案 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)
其他方式包括D1
中L1
中的值评估为True
的值之和:
a = D1[L1.astype(bool)].sum()
b = D2[L2.astype(bool)].sum()
或者取D1
次L1
的产品总和:
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
。