2013-07-07 9 views
7

Mit folgendem hypothetischen Code:Schnelle String-Array - 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 

ist es eine Möglichkeit, wie die Listen c-Arrays zu konvertieren?

Ich habe Cython - converting list of strings to char ** gelesen und versucht, aber das wirft nur Fehler.

Antwort

9

Versuchen Sie den folgenden Code. to_cstring_array Funktion im folgenden Code ist, was Sie wollen.

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']) 
+0

Nun, das ist eine tolle Antwort !! Vielen Dank dafür, aber die Sache ist jetzt, dass die Zeile ret [i] = PyString_AsString (list_str [i]) das Erhalten von char * aus dem temporären Python-Wert während der Kompilierung erhöht – Jendas

+0

Ok, mein Schlechter! Ich habe die aus cpython.string cimport PyString_AsString vergessen. Jetzt funktioniert es gut! Vielen Dank!! – Jendas