python - Cython 中的字符串操作

标签 python string cython

我的代码会执行一些 CPU 密集型字符串操作,我正在寻找提高性能的方法。

(编辑:我正在做一些事情,比如寻找最长的公共(public)子字符串,运行许多正则表达式,这些正则表达式可能更好地表示为 c 中的状态机,从 HTML 中剥离注释,诸如此类。)

我目前正在考虑将部分代码移植到 Cython在听到很多关于它的好消息之后。然而,Cython 的主要关注点似乎是数值计算,几乎没有记录使用字符串。

Unicode 也可能是一个大问题。

我的问题是:

  1. 我什至应该为字符串的东西烦恼 Cython 吗?有没有人在 cython 中有这种类型的处理经验并可以分享?
  2. 我是否遗漏了 Cython 文档中的某些内容?有谁知道有关在 Cython 中使用字符串的教程/引用/文档?

最佳答案

我对“profile it”的答案投了赞成票,但想补充一点:在可能的情况下,您可以进行的最佳优化是使用 Python 标准库或内置函数来执行您想要的任务。这些通常在 C 中实现,并将提供与任何扩展大致相当的性能,包括用 Cython 编写的扩展。如果您的算法在 Python 中执行逐字符循环,那么如果可能的话,这些应该是第一件事。

但是,如果您的算法无法根据内置函数或其他现有标准库进行修改,那么 Cython 似乎是一种合理的方法。它只是将伪 Python 编译为 native 代码,并且真的像任何其他操作一样适合字符串操作。但我不相信如果你只是将惯用的 Python 代码交给 Cython,你会看到使用 Cython 的巨大好处。如果您能够在 C 中重写每个算法的部分或全部,从而使低级操作不会不断地跨 Python/C 障碍转换变量,那么最大的好处就会出现。

最后,Unicode - 你暗示它可能是一个“大问题”,但没有具体说明你是如何使用它的。 Cython 可能会生成调用处理 Unicode 的相关 Python API 的 C 代码,因此功能不太可能受到限制。然而,在 C 中处理 Unicode 字符串并非易事,并且可能意味着在 C 中重写一些算法以获得更好的性能的想法是不值得的。许多经典的字符串算法根本不适用于许多 Unicode 编码,它们不是传统意义上的“字符串”,即每个字符有 1 个存储单元。

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

相关文章:

python - 在嵌套列表理解中只使用一个列表中的项目一次

python - 比较模板中的多个 forloop.counter 值

c# - 为什么两个空字符串相加的结果不为空?

python - python 错误的 cython 包装器中的 AttributeError

cython 在 winpython 上工作正常,但在 anaconda 上不行 - 链接问题

python - PyQt - 如何阅读文档

python忽略证书验证urllib2

Java - 字符串和数组引用

javascript - Android 将 JavaScript 代码绑定(bind)到 Android 代码不起作用?

c++ - 构建cython错误