python – 优化Cython中的字符串

前端之家收集整理的这篇文章主要介绍了python – 优化Cython中的字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图向我们的团队展示Cython的优点,以提高 Python性能.我已经显示了几个基准,所有这些都可以通过以下方式获得加速:

>编译现有的Python代码.
>将cdef用于静态类型变量,特别是内部循环.

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

我试过的一个例子是:

  1. cdef str a
  2. cdef int i,j
  3. for j in range(1000000):
  4. a = str([chr(i) for i in range(127)])

但是键入’a’作为字符串实际上使代码运行速度更慢.我已经阅读了关于“Unicode和传递字符串”的文档,但是在我看到的情况下,它是如何应用的.我们不使用Unicode – 一切都是纯ASCII.我们使用的是Python 2.7.2

任何建议是赞赏.

解决方法

我建议你在cpython.array.arrays上进行你的操作.最好的文档是C API和Cython源码,我太懒了链接了.
  1. from cpython cimport array
  2.  
  3. def cfuncA():
  4. cdef str a
  5. cdef int i,j
  6. for j in range(1000):
  7. a = ''.join([chr(i) for i in range(127)])
  8.  
  9. def cfuncB():
  10. cdef:
  11. str a
  12. array.array[char] arr,template = array.array('c')
  13. int i,j
  14.  
  15. for j in range(1000):
  16. arr = array.clone(template,127,False)
  17.  
  18. for i in range(127):
  19. arr[i] = i
  20.  
  21. a = arr.tostring()

请注意,所需的操作与您对字符串的操作有很大的不同.

  1. >>> python2 -m timeit -s "import pyximport; pyximport.install(); import cyytn" "cyytn.cfuncA()"
  2. 100 loops,best of 3: 14.3 msec per loop
  3.  
  4. >>> python2 -m timeit -s "import pyximport; pyximport.install(); import cyytn" "cyytn.cfuncB()"
  5. 1000 loops,best of 3: 512 usec per loop

在这种情况下,这是一个30倍的加速.

另外,FWIW,您可以用arr.data.as_chars [:len(arr)]替换arr.tostring(),并输入一个字节,从而取消另外几个μs.

猜你在找的Python相关文章