簡體   English   中英

Cython:我什么時候應該將字符串定義為char *,str或bytes?

[英]Cython: when should I define a string as char*, str, or bytes?

在Cython + Python 3中定義一個包含字符串的變量類型時,我可以使用(至少):

cdef char* mystring = "foo"
cdef str mystring = "foo"
cdef bytes mystring = "foo"

關於字符串文檔頁面不清楚 - 它主要是使用char *和bytes來提供示例,坦率地說,我很難理解它。

在我的情況下,字符串將來自Python3程序,並假定為unicode。 它們將用作dict鍵和函數參數,但我不會對它們進行進一步的操作。 毋庸置疑,我正在努力提高速度。

這個問題表明,在Python2.7和沒有Unicode的情況下,鍵入為str會使字符串操作代碼運行SLOWER而不是完全不輸入。 (但這並不一定與此相關,因為我不會做很多字符串操作。)

每種選擇的優點和缺點是什么?

如果沒有對特定類型進行進一步處理,那么最好不要輸入它們,這意味着它們被視為通用PyObject *

str類型是一種特殊情況 ,它表示Python 2上的bytes和Python 3上的unicode

str類型的特殊之處在於它是Python 2中的字節字符串和Python 3中的Unicode字符串

因此,將字符串鍵入為str並將其作為unicode處理的代碼將在python 2上中斷 ,其中str表示bytes

如果要將字符串轉換為C char*或C ++ std::string則只需鍵入std::string 在那里,您將使用str來處理py2 / py3兼容性,以及用於轉換為/來自字節和unicode的輔助函數,以便能夠轉換為char*std::string

鍵入字符串是為了與C / C ++進行互操作,而不是為了速度。 Cython將自動轉換一個bytes字符串,而不是復制到char* ,例如當它看到類似cdef char* c_string = b_string[:b_len] ,其中b_string是一個bytes類型。

OTOH,如果在沒有使用該類型的情況下鍵入字符串,Cython將在不需要導致開銷的情況下執行從對象到字節/ unicode的轉換。

這可以在生成為Pyx_PyObject_AsStringPyx_PyUnicode_FromString等的C代碼中看到。

一般情況下也是如此 - 經驗法則是如果不需要特定類型進行進一步處理/轉換,最好不要輸入它。 python中的所有內容都是一個對象,因此鍵入將從通用PyObject*轉換為更具體的內容。

一些快速測試顯示,對於這種特殊情況,只有str聲明有效 - 所有其他選項都會產生錯誤。 由於字符串是在Python3的其他地方生成的,顯然需要str類型聲明。

是否更快不做任何聲明仍然是一個懸而未決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM