복붙노트

[PYTHON] 빠른 문자열 배열 - Cython

PYTHON

빠른 문자열 배열 - Cython

가상의 코드를 따르는 것 :

cdef extern from "string.h":
    int strcmp(char* str1, char* str2)

def foo(list_str1, list_str2):
    cdef unsigned int i, j
    c_arr1 = ??
    c_arr2 = ??
    for i in xrange(len(list_str1)):
        for j in xrange(len(list_str2)):
            if not strcmp(c_arr1[i], c_arr2[j]):
                do some funny stuff

목록을 C 배열로 변환하는 방법이 있습니까?

Cython - 문자열 목록을 char **로 변환하고 읽었지만 오류 만 발생시킵니다.

해결법

  1. ==============================

    1.다음 코드를 시도하십시오. 다음 코드의 to_cstring_array 함수가 원하는 것입니다.

    다음 코드를 시도하십시오. 다음 코드의 to_cstring_array 함수가 원하는 것입니다.

    from libc.stdlib cimport malloc, free
    from libc.string cimport strcmp
    from cpython.string cimport PyString_AsString
    
    cdef char ** to_cstring_array(list_str):
        cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *))
        for i in xrange(len(list_str)):
            ret[i] = PyString_AsString(list_str[i])
        return ret
    
    def foo(list_str1, list_str2):
        cdef unsigned int i, j
        cdef char **c_arr1 = to_cstring_array(list_str1)
        cdef char **c_arr2 = to_cstring_array(list_str2)
    
        for i in xrange(len(list_str1)):
            for j in xrange(len(list_str2)):
                if i != j and strcmp(c_arr1[i], c_arr2[j]) == 0:
                    print i, j, list_str1[i]
        free(c_arr1)
        free(c_arr2)
    
    foo(['hello', 'python', 'world'], ['python', 'rules'])
    
  2. from https://stackoverflow.com/questions/17511309/fast-string-array-cython by cc-by-sa and MIT license