Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unicode字符串Cython上的快速迭代_Unicode_Cython - Fatal编程技术网

unicode字符串Cython上的快速迭代

unicode字符串Cython上的快速迭代,unicode,cython,Unicode,Cython,我有下面的cython函数 01: +02: cdef int count_char_in_x(unicode x,Py_UCS4 c): 03: cdef: +04: int count = 0 05: Py_UCS4 x_k 06: +07: for x_k in x: ## Yellow +08: if x_k == c: +09: count+=1 10: +11: retu

我有下面的cython函数

 01: 
+02: cdef int count_char_in_x(unicode x,Py_UCS4  c):
 03:     cdef:
+04:         int count = 0
 05:         Py_UCS4 x_k
 06: 
+07:     for x_k in x: ## Yellow
+08:         if x_k == c:
+09:             count+=1
 10: 
+11:     return count
第07行未正确优化

带注释的HTML代码展开为:

+07:     for x_k in x: ## Yellow
  if (unlikely(__pyx_v_x == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable");
    __PYX_ERR(0, 8, __pyx_L1_error)
  }
  __Pyx_INCREF(__pyx_v_x);
  __pyx_t_1 = __pyx_v_x;
  __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 8, __pyx_L1_error)
  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) {
    __pyx_t_2 = __pyx_t_7;
    __pyx_v_x_k = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2);
+07:x中的x#k:##黄色
如果(不太可能(不太可能){
PyErr_SetString(PyExc_TypeError,“'NoneType'不可编辑”);
__PYX_错误(0,8,L1_错误)
}
__Pyx_增量(Pyx_v_x);
__pyx_t_1=u pyx_v_x;
__pyx_t_6=uu pyx_init_unicode_迭代(u pyx_t_1,(&u pyx_t_3),(&u pyx_t_4),(&u pyx_t_5));如果(不太可能(uuPyx_t_6==(int)-1))uPyx_ERR(0,8,uPyx_L1_ERR)
对于(\uuuPyx\uT\u7=0;\uuPyx\uT\u7<\uuuPyx\uT\u3;\uuuPyx\uT\u7++){
__pyx_t_2=u pyx_t_7;
__pyx_v_x_k=uuu pyx_PyUnicode_读取(uuu pyx_t_5,uuu pyx_t_4,uu pyx_t_2);
  • 有什么可以改进的建议吗

  • 我认为可以编写一个cdef/cpdef函数,在运行时完全避免Python None类型检查。您知道如何做到这一点吗


生成的C代码在我看来相当不错。整个循环是一个int迭代for循环(即,它不依赖于调用Python方法
\uu iter\uuu
\uu next\uu

\uuuupyx\upyunicode\uread
(取决于您使用的Python版本)。
PyUnicode\uread
是一个C宏,它是

<>这可能是和它正在获得的一样好。你可以通过使用<代码>字节而不是<代码> Unicode (只要你处理ASCII字符),可以得到一个小小的改进。你可以考虑它是否真的值得重新实现。


如果它是一个常规的
def
函数,您可以将
x
声明为
unicode not None
,以在循环之前删除
None
检查。这可能会有一点不同。但是,正如@ead指出的那样,
cdef
函数不支持这一点。这很可能是
def
函数调用的成本l比一个
None
-检查的成本略高,但如果你在意的话,你应该计时。

谁或什么应该处理unicode字符串?C早在unicode(每个字符使用1-4字节)之前就创建了“代码”> Cython < /Code >必须实现自己的Unicode,导入一些第三方库,或者使用Python实现。Cython有能力使用C++字符串,我猜这是一个选项。@ EAD,你确实记得正确。我已经更新了我的答案。有没有其他方法可以避免循环中的无检查?也许是宏。?使用def
def
功能不起作用(大幅度)我尝试用C++的字符串/Unicode使用< Code > Cystring类型< /Code >,但我看没有区别。我认为可以编写一个 CDEF/CPDEF函数,在运行时完全避免Python <代码>没有< /Code >类型检查,但是我不知道如何去做。我不知道另一种方法来清除无检查。nce,在循环开始时(肯定不是在每次迭代中)。它最终应该是一个单指针比较,所以我不会太担心它。