【问题标题】:why are these C / Cython arrays defined as character, not integer arrays?为什么将这些 C / Cython 数组定义为字符,而不是整数数组?
【发布时间】:2010-07-31 21:07:51
【问题描述】:

为了解决问题#3367795,我必须处理一些子问题。其中之一是:在所述算法(levenshtein distance)中,在内存中分配了几个数组并用行初始化

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...>

blen 这里指的是 Python bytes 变量的长度。现在据我了解算法(完整代码请参阅我的原始帖子)以及m2 的初始化代码清楚地表明,这些数组旨在保存整数,而不是字符,所以人们会认为是正确的分配应该看起来像

cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )

等等。任何有 C 语言背景的人都可以向我解释为什么使用 char 吗?另外,对于喜欢 Cython 的人来说可能更多,为什么会有演员 &lt;char *&gt;?有人会认为char *x = malloc( ... ) 应该足以定义x

【问题讨论】:

    标签: python c cython


    【解决方案1】:

    尽管名称有误导性,C 语言中的char 类型是普通的integral 类型,就像shortintlong 等。在所有整数类型中,chars 的范围最小,占用的内存最少。因此,如果在您的应用程序中尽可能多地节省内存很重要,那么使用char 而不是int 可能是有意义的。

    在某些硬件平台上,int 类型可能比char 类型工作得更快,因此选择特定类型成为速度与内存之间的权衡,但同样,在许多情况下当char 的范围自然足够时,使用char 而不是int 可能更有意义。

    【讨论】:

    • 只是一个小注解:C99 的 int_fast8_t 类型(和派生类)将上述速度与大小的权衡留给了实现。通常它会为您提供最快的类型,至少有 8 位(在大多数系统上为一个字节,即“char”)。
    • 至少 if 这意味着一个小整数,永远不要,永远不要使用 char 作为类型,因为它的符号是未定义的,并且可能因平台而异平台。使用signed charunsigned char或更好的int_fast8_tint8_T等。
    【解决方案2】:

    很简单,为了节省内存——但请注意,将这些数组声明为 char 会将结果距离限制为 127 或 255,具体取决于 C 编译器分别默认为 signed char 还是 unsigned char。在 C 中,char 是一个整数类型——你不需要 ord() 来获取它的整数值。

    您的原始代码未提及此限制。 请注意,如果char 溢出,它会静默执行,代码会产生错误的结果 -- 127 + 1 -> -128 (signed); 255 + 1 -> 0(无符号)。

    你没有回应我对你原来的问题的评论:“”“你的字符串的 (a) 最大 (b) 平均大小是多少?你真的需要做整个 O(M*N) 的事情吗?如果这两个字符串彼此不同?""" .....请现在回答(编辑您的问题);如果你当时这样做了,那么你就会得到这个问题的答案。

    更新:再次阅读原帖,我注意到一个问题:读取的代码

    m1, m2 = m2, m1
    strcpy( m3, m2 )
    

    在三个方面是错误的:(1)它没有正确地洗牌(应该在交换m1m2之前做strcpy())(2)strcpy()不会复制第一个空值之外的任何内容(零字节)(3)不需要复制任何东西,只需洗牌指针

    m3, m2, m1 = m2, m1, m3
    

    【讨论】:

    • 谢谢;我看不到您的评论。我添加了一个编辑来回答这一点。
    • @flow: 你可以看到它 (1) 在 cmets 的末尾你会看到“显示 1 条评论” (2) 你会通过小信封收到新评论的通知页面顶部突出显示您的名字旁边的图标
    • @flow:我到底说对了什么?什么这么微妙?您是在谈论 SO 的评论可见性还是 strcpy 错误或两者兼而有之?
    • 我的意思是半灰色的小“显示更多评论”是“微妙的”。感谢您的代码修复,我已经合并了它们。现在正在运行测试,看看是否给出了正确的结果。
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 2010-09-30
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多