簡體   English   中英

使用scipy.weave.inline將大整數從Python傳遞到C / C ++

[英]Passing large integers from Python to C/C++ with scipy.weave.inline

我發現用python編寫的代碼的一部分可以在C語言中更快地完成。我使用scipy.weave.inline來做到這一點。 seek_pos是我需要傳遞到C代碼中的整數之一,(有時)大於32位長所表示的整數。 我可以找到seek_pos並獲得正確的值(也許是23億美元),但是當用它來做其他事情時,例如將其用作fseek或fseeko64中的偏移量,它的作用就好像是-19億美元(或任何其他值d可以繞開正長整數的范圍,然后再繞到負長整數)。

我的解決方法是在python y = seek_pos / N,x = seek_pos%N中分解較大的整數,傳入較小的數字,然后在C中重建較大的數字,seek_pos_off = Y * N + X。 我對Weave和C / C ++都是陌生的。我的代碼現在可以運行,但是我認為這是到達那里的一種非常荒謬的方式。也許我可以為weave.inline指定一個預制的或定制的類型轉換器,但是如何這對我來說還不清楚。

如果有人可以提出一種更好的方法,我將不勝感激,但是如果沒有,我還是想發布此信息,以便處理相同問題的人至少可以在搜索時找到我的工作。

這是我代碼的相關部分

vtrace = numpy.zeros(len_trace, dtype='short')
c_code = '''
using namespace std;
const char * cc_fpath = filepath.c_str();
FILE * infile;
infile = fopen(cc_fpath, "r");
long seek_pos_off;
long long_multiplier;
long_multiplier = seek_pos_multiplier;
long long_adder;
long_adder = seek_pos_adder;
seek_pos_off = long_multiplier * 2000000000 + long_adder;
fseek(infile, seek_pos_off, SEEK_SET);
for (int n=0; n<len_trace; n++) {
    fread(vtrace+n, data_bytes_per_channel, 1, infile);
    fseek(infile, skip_bytes, SEEK_CUR);
}
fclose(infile);

return_val = 0;
'''
filepath = str(filepath)
seek_pos = int(data_start_pos_in_bytes + start_byte)
seek_pos_multiplier = seek_pos/2000000000
seek_pos_adder = seek_pos%2000000000
weave.inline(c_code, ['vtrace', 'filepath', 'seek_pos_multiplier', 
        'seek_pos_adder', 'len_trace', 'data_bytes_per_channel', 
        'skip_bytes'], headers=['<typeinfo>'])

你有沒有嘗試過

seek_pos = long(data_start_pos_in_bytes + start_byte)

代替

seek_pos = int(data_start_pos_in_bytes + start_byte)

可能就是這樣。

暫無
暫無

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

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