Я обнаружил, что часть моего кода, написанного на python, может быть выполнена быстрее на C. Я использовал scipy.weave.inline, чтобы сделать это. seek_pos, одно из целых чисел, которое мне нужно было передать в мой C-код, было (временами) больше, чем то, что могло бы быть представлено 32-битной длиной. Я мог бы отыскать seek_pos и получить правильное значение (возможно, 2,3 миллиарда), но при выполнении других операций с ним, таких как использование его в качестве смещения в fseek или fseeko64, он действовал бы так, как будто это было -1,9 миллиарда (или любое другое значение, которое вы ‘). я получил бы от оборачивания диапазона положительных длинных целых и вокруг отрицательных длинных целых).
Мой обходной путь состоял в том, чтобы разбить большое целое число в питоне 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)
Это может быть этим.
Других решений пока нет …