为了解决问题#3367795在这里我必须应对一些子问题.其中之一是:在所述算法(levenshtein距离)中,在存储器中分配了几个数组并用线初始化
cdef char *m1 = <char *>calloc( blen + 2, sizeof( char ) )
cdef char *m2 = <char *>calloc( blen + 2, sizeof( char ) )
cdef char *m3 = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
#.........................................................................
for i from 0 <= i <= blen:
m2[ i ] = i
<...snip...>
Run Code Online (Sandbox Code Playgroud)
blen这里指的是Python bytes变量的长度.现在,据我所知的算法(参见我的原始帖子中的完整代码)和初始化代码m2清楚地显示,这些数组意味着保存整数,而不是字符,所以人们会认为正确的分配应该看起来喜欢
cdef int *m3 = <int *>malloc( ( blen + 2 ) * sizeof( int ) )
Run Code Online (Sandbox Code Playgroud)
等等.任何有C背景的人都可以向我解释为什么char使用它?对于倾向于Cython的人来说,也许更多,为什么有演员<char *>?人们会认为char *x = malloc( ... )应该足以定义x.
尽管误导名称,char类型在C语言中是普通积分的类型,就像short,int,long和这样的.在所有积分类型中,chars具有最小范围并占据最小的存储量.因此,如果在您的应用程序中保存尽可能多的内存非常重要,那么使用它char代替可能是有意义的int.
在某些硬件平台上,可能会发现int类型比类型工作得更快char,因此特定类型的选择成为速度与内存之间的权衡,但是,在很多情况下,当范围char自然足够时,它使用char而不是更有意义int.