首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的strpbrk()

Python中的strpbrk()
EN

Stack Overflow用户
提问于 2019-04-24 12:01:59
回答 1查看 345关注 0票数 2

在我正在编写的一些Python代码中,我需要计算字符串中一组字符中任意字符出现的次数。换句话说,我需要计算字符c1、c2、c3、...、cn在字符串中的总出现次数。

在C语言中,称为strpbrk()的函数可以用来做这件事,通常在x86处理器上有特殊的指令来使它更快。

我用Python编写了以下代码,但它是我的应用程序中最慢的部分。

代码语言:javascript
复制
haystack = <query string>
gc_characters = 0
for c in ['c', 'C', 'g', 'G']:
    gc_characters += haystack.count(c)

有没有更快的方法来做这件事?

EN

回答 1

Stack Overflow用户

发布于 2019-04-24 12:35:45

每次你调用.count时,它都会遍历haystack --但是在我这里建议的替代方案上,它是heavily optimized的。这取决于你的真实案例中有多少个字符。你可以试试

代码语言:javascript
复制
from collections import Counter

cnt = Counter(haystack)
gc_characters = sum(cnt.get(e, 0) for e in ['c', 'C', 'g', 'G']])

因为这将遍历字符串一次,并存储每个出现的字符的计数。如果只查找您关心的字符,并为这些字符设置一个集合以获得更快的__contains__,可能会稍微快一些。

代码语言:javascript
复制
gc_chars = {'c', 'C', 'g', 'G'}
counts = {e: 0 for e in gc_chars}

for c in gc_chars:
    if c in gc_chars:
        counts[c] += 1

gc_characters = sum(counts.values())

如果您提供更多有关hastack的组成和调用频率的详细信息,我们可以尝试为您提供更多帮助。

缓存

另一个想法是,如果hastack经常是相同的,您也许可以在内存中保留答案缓存

代码语言:javascript
复制
from functools import lru_cache

@lru_cache
def haystack_metric(hastack):
     return sum(haystack.count(c) for c in ['c', 'C', 'g', 'G']))

(使用您确定的任何实现)。你也可以探索ctypes --但我几乎没有使用它的经验。

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

https://stackoverflow.com/questions/55822235

复制
相关文章

相似问题

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