1. 程式人生 > >reduce和map的區別

reduce和map的區別

1,reduce

上程式碼:

from functools import reduce

sum1 = reduce(lambda x, y: x + y, range(1, 5))
print(sum1)  # 10

輸出結果:

10

結論:

reduce返回的是函式經過執行運算後的結果,reduce累計運算,適合做大資料的運算,前兩個元素作用得到結果後,繼續和下一個元素運算

2.map

上程式碼:

sum2 = map(lambda y: y ** 2, range(1, 5))
print(type(sum2))  # <class 'map'>
print(sum2)  # <map object at 0x7f809ce4c1d0>
for i in sum2:
    print(i)    # 1,4,9,16

輸出結果:

<class 'map'>
<map object at 0x7fb741db00f0>
1
4
9
16

結論:map返回的是個集合,函式依次作用到每一個元素,每個元素都會被函式單獨作用一次。

3.綜上所述:

    map和reduce函式均是接受兩個引數,第一個引數,均是一個函式,可以是匿名函式,也可以是普通的函式,第二個引數是一個可迭代的序列(列表 或元組)

    map函式的第一個引數是函式,函式的引數可以是1個或者多個,而reduce只能接受2個引數。

    map()是將傳入的函式依次作用到序列的每個元素,每個元素都是獨自被函式“作用”一次 。
reduce()是將傳人的函式作用在序列的第一個元素得到結果後,把這個結果繼續與下一個元素作用(累積計算)。


4.飛躍拓展:

    reduce()函式在庫functools裡,如果要使用它,要從這個庫裡匯入。reduce函式與map函式有不一樣地方,map操作是並行操作,reduce函式是把多個引數合併的操作,也就是從多個條件簡化的結果,在計算機的演算法裡,大多數情況下,就是為了簡單化。比如識別影象是否是一隻貓,那麼就是從眾多的畫素裡提煉出來一個判斷:是或否。可能是幾百萬個畫素,就只出來一個結果。在google大規模叢集裡,就是利用這個思想,把前面並行處理的操作叫做map,並行處理之後的結果,就需要簡化,歸類,把這個簡化和歸類的過程就叫做reduce。由於reduce只能在一臺主機上操作,並不能分散式地處理,但是reduce處理的是map結果,那麼意味著這些結果已經非常簡單,資料量大大減小,處理起來就非常快。因此可以把map,reduce過程叫做分析歸納的過程。