首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串的所有拆分的Cythonize列表

字符串的所有拆分的Cythonize列表
EN

Stack Overflow用户
提问于 2017-04-22 00:08:45
回答 1查看 4.8K关注 0票数 8

我试图加快一段代码来生成所有可能的字符串分裂。

代码语言:javascript
复制
splits('foo') -> [('f', 'oo'), ('fo', 'o'), ('foo', '')]

python中的代码非常简单:

代码语言:javascript
复制
def splits(text):
    return [(text[:i + 1], text[i + 1:])
            for i in range(len(text))]

有没有办法通过cython或其他方法加快速度?对于上下文,此代码的更大用途是查找具有最高概率的字符串的拆分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-22 09:45:08

这不是Cython常常帮助解决的那种问题。它使用切片,最终的速度与纯Python (实际上相当不错)相同。

使用100个字符长字节字符串(b'0'*100)和timeit中的10000次迭代,我得到:

  • 编写的代码-0.37
  • 编写但用Cython-0.21编译的代码
  • cdef int i行编译的代码在Cython-0.20中编译(这是一个小小的改进。更有意义的是长字符串)
  • 您的cdef int i和输入为bytes text - 0.28s的参数(即更糟)。
  • 最好的速度是直接使用Python (参见下面的代码)-0.11。为了方便起见,我选择主要在Cython (但自己调用API函数)中这样做,但是您可以直接用C编写非常类似的代码,只需进行更多的手工错误检查。假设您使用的是字节对象(即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))返回输出
  • 如果您不想一直使用C,那么分配列表output = [None]*len(text)并执行for循环而不是列表理解的版本要比原始版本-0.18略高一些。

总之,只需在Cython中编译它,就可以提高速度(略低于2x),设置i类型也有帮助。按照惯例,这就是使用Cython所能实现的全部功能。要获得全速,基本上需要直接使用Python。这会让你加速4倍以下,我认为这是相当不错的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43553763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档