Dask的安裝很容易直接pip install
https://docs.dask.org/en/latest/install.html
這上面介紹了三種安裝方式,pip,conda和source
需要注意的是我是macOS, pip安裝到python2.7 pip3安裝到python3.6
我也用Conda裝了我也有自己的conda,
但是我想Test卻test不出來(lái),因?yàn)槲也恢繢ask這個(gè)folder在哪里,我怎么cd到dask
可能如果要這樣run下面的test只能從source來(lái)安裝了
Test
Test Dask with py.test
//cd dask
//run py.test
算了。我們就假裝是裝好了的吧。開(kāi)始學(xué)習(xí)!
Dask Tutorial 安裝
首先我是來(lái)到了這個(gè)地址
https://tutorial.dask.org/00_overview.html
這里面缺了兩個(gè)小步驟
正確的應(yīng)該是5步驟一步不拉下
1. git clone http://github.com/dask/dask-tutorial
2. cd dask-tutorial
3.conda env create -f binder/environment.yml?
4.conda activate dark-tutorial
5. Jupyter notebook
就打開(kāi)Jupyter Notebook了
下面這個(gè)步驟在Jupyter Notebook中進(jìn)行
報(bào)錯(cuò)了我也不知道是不是對(duì)的。

好像是對(duì)的 delayed這個(gè)模塊的作業(yè)做完了哈哈
我覺(jué)得這個(gè)tutorial非常interactive
還有思考題 上機(jī)作業(yè)題 很爽啊
下面進(jìn)入作業(yè)題:
第一章:用dask.delayed并行加速
1.1 基礎(chǔ)介紹
這里給讀者簡(jiǎn)明扼要的介紹分布式是什么,用了一個(gè)例子的方式,很生動(dòng)有趣。
舉個(gè)例子,咱們用一個(gè)sleep函數(shù),讓函數(shù)執(zhí)行的時(shí)候能休眠一秒鐘

然后咱們計(jì)算結(jié)果z等于x加y,這里用到了上面的兩個(gè)函數(shù)。同時(shí)還會(huì)用到Notebook里面一個(gè)簡(jiǎn)單的功能,也就是%%time,這個(gè)功能可以計(jì)算時(shí)間,看Wall time就可以了。

看看例子,怎么用Dask Delayed來(lái)并行化加速吧,只要加一個(gè)delayed再括號(hào)就可以。當(dāng)然,在此之前需要“from dask import delayed”,最后輸出z的時(shí)候加上“.compute()"就行

其實(shí)吧,這個(gè)z為什么要后面加個(gè)compute?
這是因?yàn)閦是一個(gè)惰性對(duì)象(lazy object),當(dāng)我們寫(xiě)了 “z=delayed(add)(x,y)”的時(shí)候,還沒(méi)有計(jì)算,compute的時(shí)候才計(jì)算。這個(gè)概念如果了解Spark RDD的人應(yīng)該比較清楚了哈哈。
比較有趣的是,dask還有一個(gè)z.visualize()函數(shù)可以輸出計(jì)算圖,有點(diǎn)像tensorflow的tensorboard。

靈魂拷問(wèn)思考題:怎么加速啦?
第一個(gè)問(wèn)題:上面例子中怎么做到從3s加速到2s的,我們能不能并行加速到1s呢?
第二個(gè)問(wèn)題: 如果inc和add函數(shù)都沒(méi)有sleep(1)這個(gè)東西會(huì)怎樣?Dask還能不能加速這個(gè)代碼呢?
第三個(gè)問(wèn)題:如果我們有想訪(fǎng)問(wèn)x或者y的多個(gè)輸出會(huì)怎么樣?
第一題第二題我有答案,第三題其實(shí)不太會(huì),歡迎討論。。。
1.2 自己寫(xiě)一個(gè)for loop并行加速你會(huì)么?
沒(méi)加速的程序都已經(jīng)給你寫(xiě)好了,在下面。自己研究一下怎么用delayed做并行加速吧。照葫蘆畫(huà)瓢,其實(shí)就是想哪里加delayed的問(wèn)題。是不是只要看到函數(shù)方法就加delayed呢,我們后面會(huì)回答這個(gè)問(wèn)題。

我自己寫(xiě)的代碼長(zhǎng)這樣,好像是對(duì)的。一開(kāi)始我差點(diǎn)吧append 用了delayed。所以我覺(jué)得第二題里面如果沒(méi)有sleep用了delayed好像時(shí)間不會(huì)變化,咱們?cè)谙乱浑A段作業(yè)的時(shí)候試試唄。

1.3 并行化加速控制流怎么做?
一般來(lái)講我們不能照葫蘆畫(huà)瓢的把所有函數(shù)都delay。因?yàn)橐话銇?lái)說(shuō)我們需要delay一些函數(shù),而有些函數(shù)是要馬上調(diào)用的。特別是快速call A函數(shù)能夠決定我們是調(diào)用哪些slower的函數(shù)時(shí)。
Delay or not to delay, this is a problem!
生存與死亡是你的選擇,delay還是不delay也是哈!需要仔細(xì)考慮。
在下面的例子中,如果輸入是偶數(shù),我們調(diào)用inc函數(shù),如果是奇數(shù),我們調(diào)用double。is_even這個(gè)函數(shù)在控制流語(yǔ)句中,需要立即調(diào)用(call immediately)如果加上delay會(huì)報(bào)錯(cuò)的!

下面這才是正確的玩法

靈魂拷問(wèn):控制流加速相關(guān)
1. 還有什么別的控制流我們不能用delayed么? 姐感覺(jué)while啥的也是哈
2.如果在is_even(x)這里用了delayed會(huì)怎么樣? 前面演示了,會(huì)炸掉報(bào)錯(cuò)啊
3.為什么sum可以delay呢,sum也是計(jì)算函數(shù)而且運(yùn)行的快??? sum是比如A+B+C啥的,A B C不是并行計(jì)算的么,如果A和C算出來(lái)了不用等B可以先加的意思咯。
1.4 并行加速更復(fù)雜的代碼

用dask.delayed來(lái)并行加速上述代碼,還需要知道點(diǎn)別的儲(chǔ)備知識(shí)。?
1.訪(fǎng)問(wèn)delayed對(duì)象的方法和屬性會(huì)delay,所以如果你已經(jīng)有了一個(gè)delayed object,就可以做數(shù)值計(jì)算,切片,方法調(diào)用等等。

2.單輸出的時(shí)候 .compute() 方法還挺好用,但是多輸出的時(shí)候就用dask.compute函數(shù)吧:

我是這么寫(xiě)的 寫(xiě)錯(cuò)了!
我還是不太懂兩個(gè)點(diǎn),一個(gè)是啥應(yīng)該寫(xiě)delayed,啥不該寫(xiě)delayed
另外一個(gè)是怎么繼承delayed這個(gè)屬性啊

正確答案是這樣
從pd read csv開(kāi)始delayed 其他都是sequence可以一直繼承下來(lái)的 ,就不用再次寫(xiě)delayed了
