reduce和map的區別
阿新 • • 發佈:2019-02-12
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過程叫做分析歸納的過程。