gpt4 book ai didi

python - 使用 Python C API 将 Python 中的函数移植到 C 时遇到问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:15 26 4
gpt4 key购买 nike

我在 Python 中有一个校验和函数:

def checksum(data):
a = b = 0
l = len(data)
for i in range(l):
a += ord(data[i])
b += (l - i)*ord(data[i])

return (b << 16) | a, a, b

我正在尝试移植到 C 模块以提高速度。这是 C 函数:

static PyObject *
checksum(PyObject *self, PyObject *args)
{
int i, length;
unsigned long long a = 0, b = 0;
unsigned long long checksum = 0;
char *data;

if (!PyArg_ParseTuple(args, "s#", &data, &length)) {
return NULL;
}

for (i = 0; i < length; i++) {
a += (int)data[i];
b += (length - i) * (int)data[i];
}

checksum = (b << 16) | a;
return Py_BuildValue("(Kii)", checksum, (int)a, (int)b);
}

我通过打开一个文件并向其提供 4096 数据 block 来使用它。它们都为小字符串返回相同的值,但是当我直接从文件中为它提供二进制数据时,C 版本返回截然不同的值。任何帮助将不胜感激。

最佳答案

我猜你的局部变量中有某种溢出。可能 b 变大了。只需出于调试目的转储值,您应该看看是否是问题所在。正如您提到的,您出于性能原因正在移植该方法。你检查过psyco吗?可能足够快并且容易得多。还有更多其他工具可以将部分 python 代码即时编译为 C,但我脑子里没有这些名字。

关于python - 使用 Python C API 将 Python 中的函数移植到 C 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com