Python的len()内置O(1)时间复杂度背后的秘密是什么

时间:2018-09-02 06:22:54

标签: python c time-complexity

由于Python是用C实现的,所以我很困惑,开发人员如何使Python内置的len函数以恒定的时间O(1)在任意序列上运行,而C的字符串函数strlen以线性时间O(n)运行。

Python内置len函数的时间复杂度背后的秘密是什么?如果我们要用C编写程序,那么如果我们想对涉及序列长度的快速C程序进行复制,最好的方法是复制len的Python代码吗?

2 个答案:

答案 0 :(得分:8)

我想您可能缺少一个概念,那就是数据结构如何在恒定时间内即O(1)返回其大小。

粗略地考虑这样一个程序:

void init(){
     // code to initialize (or allocate memory) the container 
     size = 0;
}
void add(Something something){
     container.add(something);
     size++;
}
void remove(Something something){
   //Code to search 'something'
   if(found) { 
    container.remove(something); 
    size--;
   }
}
int len(){
    return size;
}

现在,您每次调用方法len()时,都可以返回整数值,而无需遍历container

为什么strlen或任何与C相关的数据结构不能那样工作,原因是 拥有类似size这样的计数器的空间开销。但这并不意味着您无法定义一个。 提示: 使用struct并保持大小不变​​。

答案 1 :(得分:1)

python中的任何字符串/列表都是一个对象。与许多对象一样,它具有len方法,该方法存储列表的长度。当我们调用__len__时,{{1}}在内部被调用,并返回存储的值,该值是O(1)运算。