1

考虑性能,我在 cython 中编写了一个函数来将 line 转换为 dict。这条线似乎

" a: 1 b:2 sdf:3.0 \t ggg:vv"

结果字典应该是

{'a': '1', 'b': '2', 'sdf': '3.0', 'ggg': 'vv'}

赛通代码是:

from libc.string cimport strsep, strlen, strdup
def line2dict(line):
    cdef char* line_str = strdup(line)
    cdef char* item_delim = " \t"
    cdef char* kv_delim   = ":"

    cdef char* kv_str
    cdef char* k_str

    ret = {}
    while 1:
        kv_str = strsep(&line_str, item_delim)
        if kv_str == NULL:
            break
        if strlen(kv_str) == 0:
            continue
        k_str = strsep(&kv_str, kv_delim)
        ret[k_str] = kv_str

    return ret

上面的代码可以编译成.so,在普通的python代码中导入和调用,但在后面的代码中可能会导致“Segmentation fault”。

我是cython的新手。谁能告诉我这段代码有什么问题?

谢谢!

4

1 回答 1

1

您的分段错误可能是NULL您的第二个 strsep 实例的返回值。如果您有一行带有尾随空格且没有 ':' 分隔符,则会发生这种情况。由于您随后将NULL作为键传递到字典中,因此这将导致分段错误。

在存储到字典之前,您应该检查NULL值。k_str

还有第二个问题。您永远不会释放用于复制字符串的内存strdup,这将浪费多余的内存。在您完成对字符串的标记之后,但在返回之前,我会调用freewhich can be cimported from 。libc.stdlib

于 2013-08-20T21:31:42.043 回答