我试图加快一段代码来生成所有可能的字符串分裂。
splits('foo') -> [('f', 'oo'), ('fo', 'o'), ('foo', '')]python中的代码非常简单:
def splits(text):
return [(text[:i + 1], text[i + 1:])
for i in range(len(text))]有没有办法通过cython或其他方法加快速度?对于上下文,此代码的更大用途是查找具有最高概率的字符串的拆分。
发布于 2017-04-22 09:45:08
这不是Cython常常帮助解决的那种问题。它使用切片,最终的速度与纯Python (实际上相当不错)相同。
使用100个字符长字节字符串(b'0'*100)和timeit中的10000次迭代,我得到:
cdef int i行编译的代码在Cython-0.20中编译(这是一个小小的改进。更有意义的是长字符串)cdef int i和输入为bytes text - 0.28s的参数(即更糟)。PyBytes而不是PyString),那么如果您使用Python2,或者Unicode和Python3,您必须稍微修改它。
从cimport * cdef导出的"Python.h":#这不包括在cpython定义#使用PyObject*而不是对象允许我们控制重新计算PyObject* Py_BuildValue(const char*,.)除了NULL def拆分(Text):cdef Py_ssize_t l之外,我cdef char* s# Cython将自动检查返回值,如果#这些失败,则会引发错误。这提供了对文本PyBytes_AsStringAndSize的类型检查( text,&s,&l) output = PyList_New(l) for i in range(l):# PyList_SET_ITEM窃取引用#转换是必要的,以确保Py_BuildValue PyList_SET_ITEM的结果(输出,i,Py_BuildValue(‘y#y#,’s,i+1,s+i+1,(L-(i+1))返回输出output = [None]*len(text)并执行for循环而不是列表理解的版本要比原始版本-0.18略高一些。总之,只需在Cython中编译它,就可以提高速度(略低于2x),设置i类型也有帮助。按照惯例,这就是使用Cython所能实现的全部功能。要获得全速,基本上需要直接使用Python。这会让你加速4倍以下,我认为这是相当不错的。
https://stackoverflow.com/questions/43553763
复制相似问题