IPython Notebook簡介1

IPython Notebook簡介1

IPython notebook目前已經(jīng)成為用Python做教學(xué)、計算扼褪、科研的一個重要工具。本文介紹IPython notebook的一些基本用法,以及如何使用它調(diào)試Cython程序嫌吠。

IPython Notebook使用瀏覽器作為界面忌警,向后臺的IPython服務(wù)器發(fā)送請求搁拙,并顯示結(jié)果秒梳。在瀏覽器的界面中使用單元(Cell)保存各種信息。Cell有多種類型箕速,經(jīng)常使用的有表示格式化文本的Markdown單元酪碘,和表示代碼的Code單元。

每個代碼單元都有一個輸出區(qū)域盐茎,在Code單元中輸入代碼兴垦,按 Shift-Enter 將運行此代碼,代碼中最后一個表達(dá)式的值將輸出區(qū)域顯示字柠。如果希望屏蔽輸出探越,可以在最后一條語句之后添加一個分號:”;”。此外窑业,代碼中還可以使用print語句在輸出區(qū)域中顯示信息钦幔。

在Markdown單元中還可以直接使用Html和Javascript。

數(shù)學(xué)公式

在Markdown單元中可以使用LaTeX表示數(shù)學(xué)公式常柄,例如

鲤氢。數(shù)學(xué)公式的顯示使用MathJax,缺省情況下拐纱,MathJax從網(wǎng)絡(luò)上下載铜异,如果希望離線使用它,需要在IPython Notebook中輸入如下代碼秸架,把MathJax安裝到本地磁盤中:

fromIPython.external.mathjaximportinstall_mathjaxinstall_mathjax()

Code單元的輸出也可以顯示為數(shù)學(xué)公式揍庄,例如在單元中輸入如下代碼,將顯示為數(shù)學(xué)公式:

fromIPython.displayimportLatexLatex(r"$\sqrt{x^2+y^2}$")

SymPy的表達(dá)式也可以顯示為LaTex东抹,例如:

%load_extsympyprintingfromsympyimport*x,y=symbols("x,y")sqrt(x**2+y**2)

以%開頭的為IPython的命令(Magic Command)蚂子,這里通過%load_ext命令載入sympyprinting擴展插件,載入此插件之后缭黔,所有的SymPy表達(dá)式都顯示為數(shù)學(xué)公式食茎。

各種顯示

IPython.display模塊中提供了許多顯示Python返回值的類,例如下面的代碼用Image類顯示”python.png”圖片馏谨,缺省路徑為Notebook文件所在的目錄:

fromIPython.displayimportImageImage(filename="python.png")

Image還可以用來顯示表示圖像的字符串别渔。例如下面的代碼通過cv2的imencode()將NumPy數(shù)組轉(zhuǎn)換為一個表示PNG圖像數(shù)據(jù)的數(shù)組,然后將此數(shù)組轉(zhuǎn)換為字符串之后通過Image()將顯示為圖像:

importcv2importnumpyasnpfromIPython.displayimportImageimg=np.random.randint(0,255,(250,250,3))cv2.blur(img,(11,11),img)r,dat=cv2.imencode(".png",img)Image(dat.tostring())

此外惧互,還可以通過HTML和Javascript將Python代碼的輸出顯示為Html哎媚,或者作為Javascript運行。

fromIPython.displayimportJavascriptJavascript("alert('ok')")

將在瀏覽器中運行Javascript代碼喊儡。

Magic命令

IPython中Magic命令有兩種執(zhí)行方式拨与,以%開始的命令被稱為行命令,它只對單行有效艾猜,以%%開頭的為單元命令买喧,它放在單元的第一行捻悯,對整個單元有效。例如timeit命令可以快速測試代碼的執(zhí)行效率淤毛,它可以作為行命令或者單元命令今缚。

%timeit1+1%timeit1.0+1.0%timeit"1"+"1"

10000000 loops, best of 3: 52 ns per loop

10000000 loops, best of 3: 53.4 ns per loop

10000000 loops, best of 3: 50.9 ns per loop

%%timeits=0foriinxrange(100):s+=i

100000 loops, best of 3: 11 us per loop

每個Magic命令都可以指定參數(shù),可以輸入timeit?查看其幫助文檔钱床。下面讓我們看看一些常用的Magic命令荚斯。

%pylab命令將載入numpy和pylab埠居,并且將這兩個模塊中的名字載入到全局名字空間中查牌。缺省參數(shù)時,它使用matplotlib的缺省界面庫顯示圖表滥壕,如果帶inline參數(shù)則將圖表作為圖像插入到Notebook中纸颜。使用界面庫顯示圖像時可以使用交互工具,而將圖表直接插入到Notebook中則有利于編寫文檔绎橘。

下面的例子胁孙,plot和random是從pylab和numpy中載入的。

%pylabinlineplot(random.randn(100));

Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].

For more information, type 'help(pylab)'.

%load可以從文件或者網(wǎng)址載入代碼到一個新的單元中称鳞,例如下面載入某個matplotlib的示例程序涮较,并執(zhí)行:

%loadhttp://matplotlib.org/mpl_examples/pylab_examples/histogram_demo.py

#!/usr/bin/env pythonimportnumpyasnpimportmatplotlib.mlabasmlabimportmatplotlib.pyplotaspltmu,sigma=100,15x=mu+sigma*np.random.randn(10000)# the histogram of the datan,bins,patches=plt.hist(x,50,normed=1,facecolor='green',alpha=0.75)# add a 'best fit' liney=mlab.normpdf(bins,mu,sigma)l=plt.plot(bins,y,'r--',linewidth=1)plt.xlabel('Smarts')plt.ylabel('Probability')plt.title(r'$\mathrm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')plt.axis([40,160,0,0.03])plt.grid(True)plt.show()

%prun用于代碼的執(zhí)行性能分析,可以作為行命令和單元命令使用冈止。下面的程序分析numpy.linalg.det()的性能:

%%prunforiinxrange(100):linalg.det(random.rand(10,10))

其輸出如下:

3402 function calls in 0.096 seconds

Ordered by: internal time

ncalls? tottime? percall? cumtime? percall filename:lineno(function)

100? ? 0.032? ? 0.000? ? 0.091? ? 0.001 linalg.py:1560(slogdet)

300? ? 0.022? ? 0.000? ? 0.022? ? 0.000 {method 'reduce' of 'numpy.ufunc' objects}

200? ? 0.011? ? 0.000? ? 0.012? ? 0.000 numeric.py:167(asarray)

100? ? 0.006? ? 0.000? ? 0.006? ? 0.000 linalg.py:84(_realType)

100? ? 0.005? ? 0.000? ? 0.005? ? 0.000 linalg.py:151(_assertRank2)

...

%load_ext載入IPython的擴展模塊狂票,通過它可以載入更多的Magic命令。下面我們載入cythonmagic模塊熙暴,并使用%%cython命令編譯一個高效的頻率統(tǒng)計函數(shù)count()闺属。

%load_extcythonmagic

測試Cython代碼

Cython的代碼基本和Python的代碼類似,但是可以使用類型聲明周霉,Cython可以使用這些類型聲明產(chǎn)生更高效的C語言代碼掂器,并編譯成Python的擴展模塊。使用%%cython命令簡化了編譯擴展模塊的過程俱箱,它會自動創(chuàng)建C語言程序国瓮,編譯并載入。由于擴展模塊無法卸載狞谱,因此IPython采用的策略是每次編譯不同的代碼都會產(chǎn)生一個全新的擴展模塊乃摹。方便我們不退出Python環(huán)境即可運行新的代碼。

%%cythondefcount(listdata):cdef:dictresult={}inti,length=len(data)objectitemforiinrange(length):item=data[i]ifiteminresult:(result[item]).append(i)else:result[item]=[i]returnresult

下面是count()的Python版本芋簿。

fromcollectionsimportdefaultdictdefcountpy(data):result=defaultdict(list)fori,iteminenumerate(data):result[item].append(i)returnresult

先測試二者的結(jié)果是否相同:

importrandomdata=[random.randint(0,100)for_inxrange(10000)]count(data)==countpy(data)

True

然后測試它們的執(zhí)行速度峡懈,可以看出Cython版本比Python的要快2倍多。在這個測試中与斤,Cython程序也同樣使用列表和字典等對象肪康,但是由于可以直接調(diào)用Python的C API荚恶,因此Cython版本的效率能提高幾倍。如果只是單純的數(shù)值運算磷支,Cython能將程序提升到與C語言相近的速度谒撼。

%timeitcountpy(data)%timeitcount(data)

100 loops, best of 3: 4.52 ms per loop

1000 loops, best of 3: 1.8 ms per loop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雾狈,隨后出現(xiàn)的幾起案子廓潜,更是在濱河造成了極大的恐慌,老刑警劉巖善榛,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩蛋,死亡現(xiàn)場離奇詭異,居然都是意外死亡移盆,警方通過查閱死者的電腦和手機悼院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咒循,“玉大人据途,你說我怎么就攤上這事⌒鸬椋” “怎么了颖医?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裆蒸。 經(jīng)常有香客問我熔萧,道長,這世上最難降的妖魔是什么光戈? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任哪痰,我火速辦了婚禮,結(jié)果婚禮上久妆,老公的妹妹穿的比我還像新娘晌杰。我一直安慰自己,他們只是感情好筷弦,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布肋演。 她就那樣靜靜地躺著,像睡著了一般烂琴。 火紅的嫁衣襯著肌膚如雪爹殊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天奸绷,我揣著相機與錄音梗夸,去河邊找鬼。 笑死号醉,一個胖子當(dāng)著我的面吹牛反症,可吹牛的內(nèi)容都是我干的辛块。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铅碍,長吁一口氣:“原來是場噩夢啊……” “哼润绵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胞谈,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尘盼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烦绳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿捎,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爵嗅,在試婚紗的時候發(fā)現(xiàn)自己被綠了娇澎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨蚁。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡睹晒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出括细,到底是詐尸還是另有隱情伪很,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布奋单,位于F島的核電站锉试,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏览濒。R本人自食惡果不足惜呆盖,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贷笛。 院中可真熱鬧应又,春花似錦、人聲如沸乏苦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇荐。三九已至洞就,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掀淘,已是汗流浹背旬蟋。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留革娄,地道東北人倾贰。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓秕狰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躁染。 傳聞我的和親對象是個殘疾皇子鸣哀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容