gpt4 book ai didi

python - 在 Cython 中优化字符串

转载 作者:太空狗 更新时间:2023-10-29 18:26:33 26 4
gpt4 key购买 nike

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

  1. 编译现有的 Python 代码。
  2. 将 cdef 用于静态类型变量,尤其是在内部循环中。

但是,我们的大部分代码都会进行字符串操作,而且我还没有想出通过键入 Python 字符串来优化代码的好例子。

我试过的一个例子是:

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。我们正在使用 Python 2.7.2

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

最佳答案

我建议您对cpython.array.array 进行操作。最好的文档是 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()

请注意,所需的操作因您对字符串所做的操作而异。

>>> python2 -m timeit -s "import pyximport; pyximport.install(); import cyytn" "cyytn.cfuncA()"
100 loops, best of 3: 14.3 msec per loop

>>> python2 -m timeit -s "import pyximport; pyximport.install(); import cyytn" "cyytn.cfuncB()"
1000 loops, best of 3: 512 usec per loop

所以在这种情况下速度提高了 30 倍。


此外,FWIW,通过将 arr.tostring() 替换为 arr.data.as_chars[:len(arr)] 和将 a 键入为 bytes

关于python - 在 Cython 中优化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23064141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com