我发现我用 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>'])