robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
buffer_ops 簡單的取代 numpy
by thinker
2 Columns
關鍵字:
Python
coding
這兩天為了某個 project ,做了一個 $Python$ 的 $C$ extension。 linkname:buffer_ops http://www.assembla.com/spaces/buffer_ops 是建立在 $Python$ 的 Simple Buffer Interface 上的模組,提供一些以 buffer object 為資料來源的運算函式。buffer_ops 適於對大量資料做簡單的運算,透過以 $C$ implement 的 function ,加速運算過程。buffer_ops 的功能並不如 numpy 那麼強大,只能提供簡單的運算。但如果你的需求也是簡單運算時,又何必要肥大的 numpy 加持呢? 這時, buffer_ops 也許正是你要的小玩具。 linkname:[Simple Buffer Interface] http://docs.python.org/3.0/c-api/typeobj.html#buffer-object-structures 是 $Python$ 用於分享資料的介面,讓 object 能將本身的 memory 區段 export 給其它程式碼使用。一般而言, $Python$ 的程式並不會使用到這個介面,但如果你需要處理大量資料,需要使用大量記憶體時,Simple Buffer Interface 會是一個好伙伴(以下簡稱 buffer)。 Buffer 能讓物件 export 自已的 memory 區塊,甚至能讓其它的code 針對區塊進行修改。通常, $Python$ 的程式總是一直在 create 新的 object。不論是加、減、乘、除,或是 sequence type 的 slice 、 join .... ,全都在 create 新的 object ,也意謂的不斷的在 allocate 記憶體。當 allocate 頻率高到一個程度時,有經驗的 programmer 會發現, CPU 把大量的時間花在 malloc 和 free 。有時,可能用掉 30% 或更多的時間。這時,如果能在一大塊記憶體做 in-place 的運算,而非不斷的 create 大量的小區塊,必定能大幅改善效率。 而 buffer 就能讓你這麼做。 buffer_ops 裡面定義了一個 buffer 的 type ,能依 programmer 的指定的參數,建立一塊特定大小的 memory block。於是,你就能在這塊 memory 進行運算,並將結果直接存在這塊 memory 裡。 這個技巧,和一般的 $Python$ 的 programming style 完全不相同。但,當你需要大量的運算和 memory 時,又想使 $Python$ 做 $coding$ 時, buffer 和 buffer_ops 或許是一個選擇。 下面是簡單的使用$範例$ {{{#!python import buffer_ops b = buffer_ops.buffer(256) # allocate 256 bytes 的記憶體 b.write('.............') # 填入資料 r = buffer_ops.sum(b, 'I') # 將 buffer 資料當成 unsigned integer 加總起來 print str(b) # 印出 raw data }}} 另外是配合字串使用 {{{#!python import buffer_ops buf = file('xxxx', 'r').read() # 將 binary 檔案內容讀進來成為字串 r = buffer_ops.sum(buf, 'i') # 當成 $C$ 的 integer 加總 }}} 因為 $Python$ 的 string 有 implement Simple Buffer Interface ,所以能被 buffer_ops 定義的 function 直接使用。 透過 buffer ,我們能將 data 以 vector 的形式進行運算,像是 vector 相加、相減之類的。而我個人的 project 則是做 bitwise 的 xor 運算。由於運算量很大,我原本是使用 numpy 。但 numpy 實在太肥了,放到產品上還得了,於是才做了 buffer_ops 。 buffer_ops 目前的功能很簡單,如果你有其它的需求,而 buffer_ops 沒照顧到,並且不會太過複雜的話,儘管開口。如果是比較複雜的功能,歡迎送 patch 過來 :p == buffer_ops 資訊 == * 網站: http://www.assembla.com/spaces/buffer_ops * Mecurial Repository: http://hg.assembla.com/buffer_ops
最後更新時間: 2009-01-17 14:18:18 CST |
引用
查詢:
COMMENTS: