优化Cython中的字符串

2024-05-26 20:46:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图向我们的小组展示Cython在增强Python性能方面的优点。我展示了几个基准,所有这些基准都通过以下方式实现加速:

  1. 编译现有的Python代码。在
  2. 对静态类型变量使用cdef,特别是在内部循环中。在

然而,我并没有通过优化我们的字符串代码的例子来优化我们的字符串。在

我试过的一个例子是:

cdef str a
cdef int i,j
for j in range(1000000):
   a = str([chr(i) for i in range(127)])

但是输入'a'作为字符串实际上会使代码运行速度变慢。我已经阅读了关于“Unicode和传递字符串”的文档,但是对于它在我展示的案例中如何应用感到困惑。我们不使用Unicode——所有东西都是纯ASCII码。我们使用的是python2.7.2

如有任何建议,我们将不胜感激。在


Tags: 字符串代码infor方式unicode小组基准
1条回答
网友
1楼 · 发布于 2024-05-26 20:46:02

我建议您对cpython.array.arrays进行操作。最好的文档是C API和Cython源代码(请参见here)。在

from cpython cimport array

def cfuncA():
    cdef str a
    cdef int i,j
    for j in range(1000):
        a = ''.join([chr(i) for i in range(127)])

def cfuncB():
    cdef:
        str a
        array.array[char] arr, template = array.array('c')
        int i, j

    for j in range(1000):
        arr = array.clone(template, 127, False)

        for i in range(127):
            arr[i] = i

        a = arr.tostring()

请注意,所需的操作与对字符串所做的操作有很大不同。在

^{pr2}$

所以在这种情况下是30倍的加速。在


另外,FWIW,您还可以通过将arr.tostring()替换为arr.data.as_chars[:len(arr)]并键入a作为bytes来删除另外几个µs。在

相关问题 更多 >

    热门问题