>>> 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 inzip(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 inzip(list1, list2)] 1 loops, best of 3: 177 ms per loop
Ответ 2
Другие приводили примеры, как это сделать на чистом python. Если вы хотите сделать это с массивами из 100.000 элементов, вам следует использовать numpy:
In [1]: import numpy as np In [2]: vector1 = np.array([1, 2, 3]) In [3]: vector2 = np.array([4, 5, 6])
Выполнение поэлементного добавления теперь так же тривиально, как
In [4]: sum_vector = vector1 + vector2 In [5]: print sum_vector [579]
точно так же, как в Matlab.
Время для сравнения с самой быстрой версией Ashwini:
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
Итак, это в 25 раз быстрее! Но используйте то, что подходит вашей ситуации. Для простой программы вы, вероятно, не хотите устанавливать numpy, поэтому используйте стандартный python (и я нахожу, что версия Генри самая питонистская). Если вы серьезно занимаетесь обработкой чисел, давайте numpy сделаем тяжелую работу. Для любителей скорости: кажется, что решение numpy работает быстрее, начиная с n = 8.
Ответ 3
[a + b for a, b inzip(list1, list2)]
Ответ 4
Как описано другими, быстрым и к тому же экономичным решением является использование numpy (np) со встроенной возможностью управления векторами:
1. С помощью Numpy
x = np.array([1,2,3]) y = np.array([2,3,4]) print x+y