如果你了解雲計算的最重要的計算框架Mapreduce,你就對Python提供的map和reduce對象有很好的理解,在大數據面前,單機計算愈加力不從心,分布式計算也就是后來的雲計算的框架擔當大任,它提高了效率、節省了時間,但是計算量並沒有減少。有點類似分久必合,合久必分的趨勢。map就是對任務分發,實現分布式計算,reduce就是把分布式計算的結果進行聚合。
Map和Reduce過程像是為控制新型肺炎而建設的火神山、雷神山醫院的建設過程,如果建設承建集團用一個10人建設隊竣工需要建設600天的話,理想情況下找來100個這樣的建設隊把工期就可縮短為6天。Map過程就是由承建方把任務分給100個建設隊分好任務去建設,reduce就是把各自建設好的工程再整合起來統一交付給承建方。
談到雲計算的起源,就不得不提Google的三駕馬車:Google FS、MapReduce、BigTable。雖然Google沒有公布這三個產品的源碼,但是他發布了這三個產品的詳細設計論文,奠定了風靡全球的大數據算法的基礎!
2004年公布的 MapReduce論文,論文描述了大數據的分布式計算方式,主要思想是將任務分解然后在多台處理能力較弱的計算節點中同時處理,然后將結果合並從而完成大數據處理。
map(function, iterable, ...)
返回一個將 function 應用於 iterable 中每一項並輸出其結果的迭代器。如果傳入了額外的 iterable 參數,function 必須接受相同個數的實參並被應用於從所有可迭代對象中並行獲取的項。當有多個可迭代對象時,最短的可迭代對象耗盡則整個迭代就將結束。
它的第一個參數是一個函數的名字,后面是一個可迭代對象。
舉例說明,比如我們有一個函數f(x)=x*x,要把這個函數作用在一個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實現如下:現在,我們用Python代碼實現:
1 >>> def f(x): 2 return x * x 3 >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) 4 >>> list(r) 5 [1, 4, 9, 16, 25, 36, 49, 64, 81]
map()傳入的第一個參數是f,即函數對象本身。由於結果r是一個Iterator,Iterator是惰性序列,因此通過list()函數讓它把整個序列都計算出來並返回一個list。
實戰:請利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字的list
任務
假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則,請利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字的list:
輸入:['adam', 'LISA', 'barT']
輸出:['Adam', 'Lisa', 'Bart’]
參考代碼:
1 def f(s): 2 s1 = s[0:1].upper() +s[1:].lower() 3 return s1 4 print(list(map(f,['jake','JOE'])))
結果:
['Jake', 'Joe']