Python3中的Cython字节错误

2024-05-19 19:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的开源项目(bquery),我遇到了一个cython代码的问题,它在python2.7中运行得非常好,但是在python3.x中却抛出了一个错误。 有关整个代码,请参见:https://github.com/visualfabriq/bquery/pull/66

但是要给出一个想法:代码的思想是使一个分组中每个元素的值计数不同/唯一。我对两个值进行哈希检查,以确保它们是唯一的(否则,我将需要每个组使用一个哈希表,这在许多情况下可能更有效,但在这里与底层技术不同,我不希望多次遍历这些值)。 为了使值唯一,我创建了一个连接字符串(中间有一个分隔符),然后检查哈希表。到目前为止,很好!在Python2中给出了一个完美的结果并且相当快。但是在python3中我遇到了错误。在

代码如下:

cdef

    kh_str_t * table
    char * element_1
    char * element_2
    char * element_3
    int ret, size_1, size_2, size_3

v = in_buffer[i]
# index
size_1 = len(bytes(current_index)) + 1
element_1 = < char * > malloc(size_1)
strcpy(element_1, bytes(current_index))
# value
size_2 = len(str(v)) + 1
element_2 = < char * > malloc(size_2)
strcpy(element_2, bytes(v))
# combination
size_3 = size_1 + size_2 + 2
element_3 = < char * > malloc(size_3)
strcpy(element_3, element_1 + '|' + element_2)
# hash check
k = kh_get_str(table, element_3)
if k == table.n_buckets:
    # first save the new element
    k = kh_put_str(table, element_3, & ret)
    # then up the amount of values found
    out_buffer[current_index] += 1

这是一个错误:

^{pr2}$

我一定忽略了一些很明显的东西,但我不知道我错过了什么。如有任何指导或帮助,我们将不胜感激!!!在

BR公司

岩溶


Tags: 代码sizeindexbytes错误tableelementcurrent
1条回答
网友
1楼 · 发布于 2024-05-19 19:29:33

因此,Python2.X^{cd1>}是^{cd2>}的别名

>>> bytes(42.0)
'42.0'

然而,在Python3.X中,^{{cd1>}有一个新的构造函数,给定的是除^{{cd4>}或^{{cd2>}之外的任何内容,它将其视为一个不可接受的ints。所以你看到的错误。

^{pr2}$

解决方案是使用:

^{pr3}$

是的,它不漂亮,需要两个数据副本,但是它在Python 2和3上都有效。

相关问题 更多 >