[英]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_AsString
, Pyx_PyUnicode_FromString
等的C代碼中看到。
一般情況下也是如此 - 經驗法則是如果不需要特定類型進行進一步處理/轉換,最好不要輸入它。 python中的所有內容都是一個對象,因此鍵入將從通用PyObject*
轉換為更具體的內容。
一些快速測試顯示,對於這種特殊情況,只有str
聲明有效 - 所有其他選項都會產生錯誤。 由於字符串是在Python3的其他地方生成的,顯然需要str
類型聲明。
是否更快不做任何聲明仍然是一個懸而未決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.