2

http://www.cs.bell-labs.com/cm/cs/pearls/sol01.htmlから:

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 で同じことを実行できる優れたライブラリを知っている人はいますか?

4

3 に答える 3

3

Numpy または ctypes はどちらも適切な選択です。しかし、Python コードは本当に C と同じくらい効率的である必要があると確信していますか? また、このコードがパフォーマンスのホットスポットであると確信していますか?

最善の方法は、Python プロファイラーを使用して、このコードが本当に C と同じくらい効率的である必要があることを確認することです。本当に必要な場合は、コードを C のままにして、何かを使用してリンクするのがおそらく最も簡単です。 ctypes や SWIG のように。

編集:更新された質問に答えるために、要素サイズMのサイズNのnumpy配列には、N * Mバイトの連続メモリに加えて、ヘッダーとビュー用のいくつかのバイトが含まれます。

関連するリンクをいくつか次に示します。

于 2012-08-15T18:26:18.520 に答える
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 
于 2012-08-15T18:29:34.530 に答える
2

これ:

a=[c_int()]

c_int オブジェクトへの参照を含むリストを作成します。

リストを乗算すると、参照が複製されるだけなので、次のようになります。

a = [c_int()] * 1024 * 1024

実際には、同じ単一の c_int オブジェクトへの 1024 * 1024 参照のリストを作成します。

1024 * 1024 c_ints の配列が必要な場合は、次のようにします。

a = c_int * (1024 * 1024)
于 2012-08-15T18:52:12.923 に答える