在我正在编写的一些Python代码中,我需要计算字符串中一组字符中任意字符出现的次数。换句话说,我需要计算字符c1、c2、c3、...、cn在字符串中的总出现次数。
在C语言中,称为strpbrk()
的函数可以用来做这件事,通常在x86处理器上有特殊的指令来使它更快。
我用Python编写了以下代码,但它是我的应用程序中最慢的部分。
haystack = <query string>
gc_characters = 0
for c in ['c', 'C', 'g', 'G']:
gc_characters += haystack.count(c)
有没有更快的方法来做这件事?
发布于 2019-04-24 12:35:45
每次你调用.count
时,它都会遍历haystack
--但是在我这里建议的替代方案上,它是heavily optimized的。这取决于你的真实案例中有多少个字符。你可以试试
from collections import Counter
cnt = Counter(haystack)
gc_characters = sum(cnt.get(e, 0) for e in ['c', 'C', 'g', 'G']])
因为这将遍历字符串一次,并存储每个出现的字符的计数。如果只查找您关心的字符,并为这些字符设置一个集合以获得更快的__contains__
,可能会稍微快一些。
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
经常是相同的,您也许可以在内存中保留答案缓存
from functools import lru_cache
@lru_cache
def haystack_metric(hastack):
return sum(haystack.count(c) for c in ['c', 'C', 'g', 'G']))
(使用您确定的任何实现)。你也可以探索ctypes --但我几乎没有使用它的经验。
https://stackoverflow.com/questions/55822235
复制相似问题