我發現用C編寫的一部分代碼可以在C中更快地完成。我用scipy.weave.inline來做到這一點。 seek_pos是我需要傳入C代碼的整數之一,有時比32位長的代表更大。我可以找到seek_pos並獲得正確的值(可能是23億),但是在做其他事情時,比如使用它作爲fseek或fseeko64中的偏移量,它的行爲好像是-1.9億(或者任何「 d從正值長整數的範圍和負長整數的範圍中獲得)。用scipy.weave.inline從Python傳遞C/C++的大整數
我的方法是在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>'])
對於開始,我總是會讓'N'成爲2的冪。然後乘法和除法與餘數相比只是一個位移,這會更有效率。不過,請考慮一下你的問題。 –
如果你改變你的C代碼,所以它會說'unsigned long' everywhere而不是'long'會發生什麼?你有沒有把'type_converters'的參數看作'weave.inline'? –
感謝2注的力量,我會做出改變。我在這裏有點新,有沒有辦法讓我評論這個評論有幫助? 我還沒有嘗試unsigned long,但我希望它能用於我提到的例子(23億)。雖然我提到了23億,但實際上我需要使用大於無符號長整數的數字。 – jpobst