c++ - 使用 scipy.weave.inline 将大整数从 Python 传递到 C/C++

标签 c++ python c scipy largenumber

我发现用 python 编写的部分代码可以用 C 更快地完成。我使用 scipy.weave.inline 来做到这一点。 eek_pos 是我需要传递到 C 代码中的整数之一,它(有时)比 32 位长所能表示的要大。我可以计算出eek_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)

也许就是这样。

关于c++ - 使用 scipy.weave.inline 将大整数从 Python 传递到 C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643877/

相关文章:

c++ - 使用字符串文字初始化非常量参数

c++ - 模板化 lambda 的显式实例化

python - 用 scipy 解决颂歌系统 - 如何引用不同的索引?

c - 具有多维数组的 malloc

c - 给定数组中有多少个字符(除了空格)

c++ - 当 select 子句中使用 case 时,Oracle 数字精度和小数位数均为零

c++ - Windows USB 教程

python - 在Python中将字符串转换为二进制整数

python - Flask WTForms - 基于多个表单字段的自定义验证器

c - 您应该在传递给函数的参数之前检查它们,还是在函数中检查它们?