>>> list2 =[4,5,6]*10**5>>> list1 =[1,2,3]*10**5>>>%timeit from operator import add;map(add, list1, list2)10 loops, best of 3:44.6 ms per loop
>>>%timeit from itertools import izip;[a + b for a, b in izip(list1, list2)]10 loops, best of 3:71 ms per loop
>>>%timeit [a + b for a, b in zip(list1, list2)]10 loops, best of 3:112 ms per loop
>>>%timeit from itertools import izip;[sum(x)for x in izip(list1, list2)]1 loops, best of 3:139 ms per loop
>>>%timeit [sum(x)for x in zip(list1, list2)]1 loops, best of 3:177 ms per loop
>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop
In[16]:from operator import add
In[17]: n =10**5In[18]: vector2 = np.tile([4,5,6], n)In[19]: vector1 = np.tile([1,2,3], n)In[20]: list1 =[1,2,3]*n
In[21]: list2 =[4,5,6]*n
In[22]: timeit map(add, list1, list2)10 loops, best of 3:26.9 ms per loop
In[23]: timeit vector1 + vector2
1000 loops, best of 3:1.06 ms per loop
The others gave examples how to do this in pure python. If you want to do this with arrays with 100.000 elements, you should use numpy:
In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])
Doing the element-wise addition is now as trivial as
In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]
just like in Matlab.
Timing to compare with Ashwini’s fastest version:
In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop
In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop
So this is a factor 25 faster! But use what suits your situation. For a simple program, you probably don’t want to install numpy, so use standard python (and I find Henry’s version the most Pythonic one). If you are into serious number crunching, let numpy do the heavy lifting. For the speed freaks: it seems that the numpy solution is faster starting around n = 8.
import numpy as np
>>> list1 =[1,2]>>> list2 =[1,2,3]>>> list3 =[1]>>>[a + b for a, b in zip(list1, list2)][2,4]>>>[a + b for a, b in zip(list1, list3)][2]>>> a = np.array (list1)>>> b = np.array (list2)>>> a+b
Traceback(most recent call last):File"<stdin>", line 1,in<module>ValueError: operands could not be broadcast together with shapes (2)(3)
Perhaps “the most pythonic way” should include handling the case where list1 and list2 are not the same size. Applying some of these methods will quietly give you an answer. The numpy approach will let you know, most likely with a ValueError.
Example:
import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)
Which result might you want if this were in a function in your problem?
回答 6
这很简单 numpy.add()
import numpy
list1 = numpy.array([1,2,3])
list2 = numpy.array([4,5,6])
result = numpy.add(list1, list2)# result receive element-wise addition of list1 and list2print(result)
array([5,7,9])
Although, the actual question does not want to iterate over the list to generate the result, but all the solutions that has been proposed does exactly that under-neath the hood!
To refresh: You cannot add two vectors without looking into all the vector elements. So, the algorithmic complexity of most of these solutions are Big-O(n). Where n is the dimension of the vector.
So, from an algorithmic point of view, using a for loop to iteratively generate the resulting list is logical and pythonic too. However, in addition, this method does not have the overhead of calling or importing any additional library.
# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]
The timings that are being showed/discussed here are system and implementation dependent, and cannot be reliable measure to measure the efficiency of the operation. In any case, the big O complexity of the vector addition operation is linear, meaning O(n).
回答 14
a_list =[]
b_list =[]for i in range(1,100):
a_list.append(random.randint(1,100))for i in range(1,100):
a_list.append(random.randint(101,200))[sum(x)for x in zip(a_list , b_list )]
a_list = []
b_list = []
for i in range(1,100):
a_list.append(random.randint(1,100))
for i in range(1,100):
a_list.append(random.randint(101,200))
[sum(x) for x in zip(a_list , b_list )]