Python 板


LINE

最近開始用python進行一些數據分析... 想跟各位分享一下 使用Scipy + Numpy 將 C語言整合至python的心得: python在某些情況下的速度實在是讓人無法忍受 (ex. 對大型List做兩三層迴圈以上的數學運算) 為了增強python在這方面的功能 有兩個好用的module: SciPy & Numpy numpy 基本上是使用自訂的 "array" 相較於python list, numpy array裡的元素資料型態是一致的 所以在記憶體的使用上有較高效率 而且內建的 "universal function" (ufunc)功能 可以一次對整個numpy array做簡單的數學函數運算 可惜如果運算稍微複雜一點時, numpy 提供的 frompython (將自訂函數轉成universal function) 相較於使用python本身去寫並沒有快多少 速度上還是不如C語言 這個時候Scipy就可以出場了... Scipy本身的功能也相當強大,比如說scipy.matplotlib用來繪圖就蠻方便的 其中的scipy.weave更提供了直接在python 裡面使用C語言(and C++)的功能: 舉例來說, hello world: from scipy import weave code="""printf("Hello World! \\n");""" weave.inline(code) 當然, 這看起來像脫褲子放屁 XD 不過如果有一個或好幾個很長的numpy array, 就可以用weave.blitz 結合weave.inline 直接傳到在python裡面寫的C code裡 舉例: import numpy as np from scipy import weave a=np.arange(0,1000,dtype=float).reshape(500,2) #產生((0,1),(2,3),(4,5)...(998,999))的500*2矩陣,並指定資料型態為float code=""" float k=0.0; for(int i=0;i<500;i++) { k+=a(i,0)+a(i,1); //直接在code裡面使用剛剛產生的矩陣 } return Py_BuildValue("d", k); //傳回一個float給python """ print weave.inline(code, ['a'], type_converters=weave.converters.blitz, compiler='gcc') 就會出現從0 加到 999的值囉 如果要傳回python list, 可以在C code裡宣告 ex. PyObject *m = PyList_New(0); 對這個list 可以像在python 裡面一樣操作, 如: PyList_Append(m, PyFloat_FromDouble(k)); 因為是在C語言裡面,所以資料型態要指定好 關於如何增加python的效率, 有興趣的人可以看看這邊 http://www.scipy.org/PerformancePython 個人是覺得簡單但是大量的運算 用weave.inline 搭配 numpy, weave.blitz是相當方便的組合 cython or SWIG速度比inline快上一點, 但是使用上稍微複雜一些(對我來說 XD) 如果是使用windows的話 python(x,y)裝了就可以直接用scipy.weave & numpy了 用linux的話就是手動裝scipy & numpy, 要使用weave的話得多裝python-dev 還有要更改這個 /usr/lib/python2.6/dist-packages/scipy/weave/blitz/blitz/blitz.h 在#include <stdio.h> 之前添加: #include <cstdlib> 以上拋磚引玉 希望有更多高手可以分享使用python 做科學研究的心得 ~OTZ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 129.170.26.186 ※ 編輯: painkiller 來自: 129.170.26.186 (04/09 08:20) ※ 編輯: painkiller 來自: 129.170.26.186 (04/09 08:21)
1F:→ juiz:Join us in http://conference.scipy.org/scipy2011/ 04/09 08:24
2F:推 pcedison:感謝分享 04/09 08:30
3F:推 curist:推推 04/09 18:09
4F:推 mjsg:感謝分享 04/09 20:04
5F:推 cobrasgo:如果是我的話,重點應該會放在那兩三層的迴圈有沒有辦法 04/10 15:49
6F:→ cobrasgo:改寫邏輯 04/10 15:49
7F:→ painkiller:嗯...大概是我舉得例不好 光是取sin值100萬次的話 04/10 22:33
8F:→ painkiller:python就比weave慢個10倍左右 04/10 22:33
9F:推 guteres:請問有沒有辦法把code另外存成檔案再去call它? 04/11 00:07
10F:→ painkiller:可能要用SWIG之類的套件喔... 那個我很不熟耶 :P 04/11 22:33
11F:推 guteres:soga 04/13 00:13
12F:推 cobrasgo:用c binding不就可以了? 04/13 00:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP