0

これは私の最初のcython(pyx)モジュールです。どうすればこれを速くできますか?具体的には、最後の行で助けを探しています。コンパイルして実行しますが、Py *オブジェクトに変換されるのではないかと心配しています。これは、おそらくはるかに高速である可能性があります。

また、明らかなエラーが発生した場合は、お知らせください。

ctypedef unsigned short UInt8

DEF BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

def encode_16_bytes(char *thebytes):
    cdef UInt8 *b      # the bytes cast to an array of UInt8
    cdef int i         # used to assign a value to the buffer
    cdef int j         # used to count up through the bytes
    cdef char buf[23]  # the resulting buffer of characters

    # initialize variables
    for i in range(23): # set buf array to zeros
        buf[i] = '\0'
    b = <UInt8 *>thebytes
    i = 0
    j = 1

    i += 1
    buf[i] = BASE64[(b[0] >> 6) & 0x3F]
    i += 1
    buf[i] = BASE64[b[0] & 0x3F]

    # iterate through the bytes 4 words at a time, setting each byte to its
    # mapped BASE64 counterpart
    while j < 16:
        i += 1
        buf[i] = BASE64[(b[j] >> 2) & 0x3F]
        i += 1
        buf[i] = BASE64[((b[j] << 4) | (b[j + 1] >> 4)) & 0x3F]
        i += 1
        buf[i] = BASE64[((b[j + 1] << 2) | (b[j + 2] >> 6)) & 0x3F]
        i += 1
        buf[i] = BASE64[b[j + 2] & 0x3F]
        j += 3

    # join up the characters into a string
    return "".join([chr(buf[i]) for i in range(23)])

ありがとう!

4

1 に答える 1

1

"" .join(...)を次のように置き換えることで、C文字バッファからPythonバイト文字列を作成できます。

bytes_string = chr[:23]

またはより一般的に:

bytes_string = chr[:buffer_length]

参考資料やその他の例については、こちらをご覧ください。

于 2012-09-20T17:10:58.183 に答える