2013-05-31 23 views
1

考慮性能,我寫了一個函數在cython中conert line into dict。 線好像我的cython(pyx)代碼轉換爲字典的問題是什麼?

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

結果字典應該是

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

的用Cython代碼:

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 

上面的代碼可以被編譯成。所以,導入並在常規Python代碼中調用,但可能會導致「Segm在後面的代碼中引入錯誤「。

我是一個新手在cython。任何人都可以告訴我這段代碼有什麼問題嗎?

謝謝!

+1

我想你不應該用C指針作爲鍵和值來構建Python字典。您可能需要將這些char *轉換爲python對象。看到這個鏈接:http://docs.cython.org/src/tutorial/strings.html – jcrudy

回答

1

您的分段錯誤很可能是您的第二個strsep實例的返回值NULL。如果你有一行尾隨空格,並且沒有':'分隔符,就會發生這種情況。由於您將NULL作爲關鍵字傳入您的字典,因此會導致分段錯誤。

在存儲到字典中之前,您應該檢查NULL的值k_str

還有第二個問題。你永遠不會釋放用於複製你的字符串的內存,這將浪費多餘的內存。我會打電話free可以從libc.stdlib進出口,你完成了你的字符串標記後,但在返回之前。