2012-08-15 49 views
2

http://www.cs.bell-labs.com/cm/cs/pearls/sol01.html如何使用python構建一個int arrray和manuplate它與C一樣高效?

C代碼是這樣的:

#define BITSPERWORD 32 
#define SHIFT 5 
#define MASK 0x1F 
#define N 10000000 
int a[1 + N/BITSPERWORD]; 

void set(int i) {  a[i>>SHIFT] |= (1<<(i & MASK)); } 
void clr(int i) {  a[i>>SHIFT] &= ~(1<<(i & MASK)); } 
int test(int i){ return a[i>>SHIFT] & (1<<(i & MASK)); } 

我發現ctypesBitArraysnumpy但我不知道他們是否可以像上面的C代碼一樣高效。

例如,如果我寫這樣的代碼:

from ctypes import c_int 
a=[c_int(9)]*1024*1024 

會使用的空間1M字節,或者更多?

有誰知道一些好的庫,可以在Python中做同樣的事情嗎?

+5

什麼是您認爲當前實現效率不高你的使用情況? – 2012-08-15 18:25:33

+0

@BurhanKhalid我爲這個問題增加了更多的描述,'a = [c_int(9)] * 1024 * 1024'會使用多於'1M Bytes'嗎? – 2012-08-15 18:29:06

+0

澄清:當你說「高效」時,你的意思是什麼?你想最大限度地減少壁掛時間,最小化CPU時間,最大限度地減少內存使用,或者不同的東西? – 2012-08-15 18:29:39

回答

3

Numpy或ctypes都是不錯的選擇。但是你確定你的Python代碼真的需要和C一樣高效,你確定這個代碼是一個性能熱點嗎?

要做的最好的事情是使用Python分析器來確保這個代碼確實需要和C一樣高效。如果它確實如此,那麼將代碼保存在C和鏈接中可能是最容易的使用類似ctypes或SWIG的東西。

編輯:要回答您更新的問題,元素大小爲M的大小爲N的numpy數組將包含N * M個字節的連續內存,外加一個標題和一些字節用於視圖。

這裏有幾個相關鏈接:

2

,你也可以檢查內置array模塊:

>>> import array 
>>> help(array) 
Help on built-in module array: 

NAME 
    array 

FILE 
    (built-in) 

DESCRIPTION 
    This module defines an object type which can efficiently represent 
    an array of basic values: characters, integers, floating point 
    numbers. Arrays are sequence types and behave very much like lists, 
    except that the type of objects stored in them is constrained. The 
    type is specified at object creation time by using a type code, which 
    is a single character. The following type codes are defined: 

     Type code C Type    Minimum size in bytes 
     'b'   signed integer  1 
     'B'   unsigned integer 1 
     'u'   Unicode character 2 (see note) 
     'h'   signed integer  2 
     'H'   unsigned integer 2 
     'i'   signed integer  2 
     'I'   unsigned integer 2 
     'l'   signed integer  4 
     'L'   unsigned integer 4 
     'f'   floating point  4 
     'd'   floating point  8 
1

此:

a=[c_int()] 

生成一個包含對c_int對象的引用的列表。

乘以名單僅僅是重複的引用,因此:

a = [c_int()] * 1024 * 1024 

實際創建的1024次* 1024的引用到相同單c_int的對象列表。

如果你想爲1024×1024 c_ints一個數組,這樣做:

a = c_int * (1024 * 1024) 
相關問題