簡體   English   中英

將2D可變長度數組傳遞給Python和C的好方法?

[英]Good ways to pass 2D variable length arrays to/from Python and C?

通過一些黑客攻擊,我使用python c-types在Python和C之間來回傳遞數據。 這看起來有點混亂,所以我希望有更多經驗的人可以告訴我,如果我做錯了什么,或者讓它變得比它需要的更難。

Python代碼:

from ctypes import cdll, POINTER, byref, c_double
lib = cdll.LoadLibrary('./test.so')

def alloc_arrays(length, python_list):
    # Create array of float*
    data = ((POINTER(c_double)) * length)()
    out_data = ((POINTER(c_double)) * length)()
    for i in xrange(length):
        # Create arrays of float
        data[i] = (c_double * 3)()
        out_data[i] = (c_double * 3)()
        # Set Values
        for j in xrange(3):
            data[i][j] = python_list[i][j]
            out_data[i][j] = 0.0
    return data, out_data

if __name__ == "__main__":
    a = [[1.0, 11.0, 21.0],
         [2.0, 12.0, 22.0],
         [3.0, 13.0, 23.0],
         [4.0, 14.0, 24.0],
         [5.0, 15.0, 25.0],
         [6.0, 16.0, 26.0],
         [7.0, 17.0, 27.0]]
    in_data, out_data = alloc_arrays(len(a), a)
    out_len = lib.smain(byref(in_data), len(a), out_data)

    print "out_len", out_len
    clean_out = [None, None, None]
    clean_out = [clean_out[:] for i in xrange(out_len)]
    for i in xrange(out_len):
        for j in xrange(3):
            clean_out[i][j] = out_data[i][j]
    print "Out:", clean_out

C代碼(test.c):

int smain(double* in_points[3], int in_len, double* out_points[3]){
    int i;
    int j;
    printf("%s", "\n");
    for(i = 0; i < in_len; i++){
        for(j = 0; j < 3; j++){
            printf("%g, ", *in_points[i][j]);
        }
        printf("%s", "\n");
    }
    printf("%s", "\n");

    //*out_points = malloc(len*sizeof(float[3]));
    int out_len = in_len-2; //Randomly chosen shorter length
    for(i = 0; i < out_len; i++){
        for(j = 0; j < 3; j++){
            //Random function just to see I can do this
            *out_points[i][j] = i*j;
        }
    }
    return out_len;
}

要構建我使用:

gcc -c -fPIC test.c
gcc -shared -o test.so test.o

我想知道的主要問題是,是否有更好的方法來創建空的2D向量以傳遞到C,並且如果有更好的方法將變量轉換為/從ctypes到python類型。 我不喜歡alloc_arrays函數必須進行轉換,我不喜歡讓我的for循環讀取c_types 2D列表(只是意識到我做得有點亂)。

編輯:只是想明確這個代碼按預期工作,我只是認為必須有一些方法來改進它。

這不是關於你的確切代碼和ctypes的答案,但我想貢獻...

我最近剛進入cython。 我甚至還不是中級的,但是對於編寫擴展它似乎更加友好,並且有很多關於使用numpy數組的例子。

到目前為止,我發現cython非常棒,因為它可以讓你保持類似python的語法,並且可以自由地混合python。 在幫助將代碼轉換為封裝器中的C方面,它為您處理了相當多的繁重工作。 並且在生成的.so中沒有中間依賴關系。 只是一個純粹的擴展。

如果您在python代碼中使用numpy,那么將它們傳遞到您的擴展中將毫不費力,因為它不需要進行任何轉換。 numpy本身已經是python方面的一個大加速,但做額外的自定義東西將允許你只是將​​numpy指針傳遞到cython擴展端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM