我发现用python编写的代码的一部分可以在C中更快地完成。我使用scipy.weave.inline来做到这一点。 seek_pos,我需要传递给我的C代码的整数之一,(有时)大于32位长代表的整数。我可以cout seek_pos并获得正确的值(可能是23亿),但是在使用它做其他事情时,例如将其用作fseek或fseeko64中的偏移量,它就好像它是-1.9亿(或者你的任何值) d从包裹过去的正整数和整数范围到负数长整数。)
我的工作方法是在python中断开大整数y = seek_pos / N,x = seek_pos%N,传入那些较小的数字并重建C中较大的数字,seek_pos_off = Y * N + X.我对Weave和C / C ++都很陌生。我的代码现在可以工作了,但我认为这是一种非常荒谬的方式。也许我可以为weave.inline指定一个premade或自定义类型的转换器,但是如何这对我来说并不清楚。
如果有人可以建议更好的方法,我会很感激,但如果没有,我想发布这个,以便处理相同问题的人至少可以在搜索时找到我的工作。
这是我的代码的相关部分
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>'])
答案 0 :(得分:0)
你试过吗
seek_pos = long(data_start_pos_in_bytes + start_byte)
而不是
seek_pos = int(data_start_pos_in_bytes + start_byte)
可能就是这样。