字符串Python上的count操作的计算成本是多少?
作者:互联网
例如:
'hello'.count('e')
这是O(n)吗?我猜它的工作方式是它扫描’你好’并在每次看到字母’e’时递增一个计数器.我如何在不猜测的情况下知道这一点?我尝试阅读源代码here,但发现这个问题一直困扰着:
def count(s, *args):
"""count(s, sub[, start[,end]]) -> int
Return the number of occurrences of substring sub in string
s[start:end]. Optional arguments start and end are
interpreted as in slice notation.
"""
return s.count(*args)
我在哪里可以读到s.count(* args)中执行的内容?
编辑:我理解* args在Python函数的上下文中的作用.
解决方法:
str.count在本机代码中实现,在stringobject.c
文件中,委托给stringlib_count
或PyUnicode_Count
,它本身再次委托给stringlib_count. stringlib_count最终使用fastsearch
来搜索字符串中子字符串的出现次数并对其进行计数.
对于单字符字符串(例如您的’e’),它会与以下代码路径短路:
for (i = 0; i < n; i++)
if (s[i] == p[0]) {
count++;
if (count == maxcount)
return maxcount;
}
return count;
所以是的,这就像你假设对字符串序列的简单迭代并计运算符字符串的出现一样.
对于长于单个字符的搜索字符串,由于处理重叠等原因,它会变得更复杂一些,并且逻辑被深埋在快速搜索实现中.但它基本上是相同的:通过字符串进行线性搜索.
所以是的,str.count是线性时间,O(n).如果你考虑一下,它就会很有意义:为了知道子串出现在字符串中的频率,你需要查看相同长度的每个可能的子串.因此,对于子字符串长度为1,您必须查看字符串中的每个字符,从而为您提供线性复杂性.
顺便说一句.有关底层快速搜索算法的更多信息,请参阅this article on effbot.org.
对于仅具有单个Unicode字符串类型的Python 3,实现的链接是:unicode_count
,其使用stringlib_count
,其使用fastsearch
.
标签:python,python-2-7,big-o 来源: https://codeday.me/bug/20190724/1525648.html