如何在Python中的各种容器类型中实现__len__方法?

时间:2013-10-17 11:42:39

标签: python

到目前为止,当我将len函数用于各种容器类型时(现在假设为list类型),我假设每个容器类型都有一个字段存储特定对象长度的成员..来自Java,这很有意义。但是当我开始思考它时,我认为这不是真的,这让我很困惑。

每当我在实现len的对象上使用__length__函数时,它是通过迭代对象的元素来计算长度,还是只是以某种方式立即返回长度?

实际上我使用dict内置类型来问我这个问题。我在字典中添加了一些元素(很多元素),最后我需要获取字典中的元素数量,所以因为我不确定len函数的时间复杂度是多少,所以我决定在插入元素时对元素进行计数......但我不确定这是解决问题的正确方法。

这是我的问题的示例代码:

d = {}
count = 0
for i in range(10 ** 6):
    d[i] = True
    count += 1

VS

d = {i: True for i in range(10 ** 6)}
count = len(d)

第二个解决方案对我来说看起来更好(也更短)......我知道理论上时间复杂度是否相同len函数是否是即时的,在第二个解决方案中我担心它会迭代两次到10 ** 6次(首先是字典理解,第二次是长度计算)。

请启发我。

1 个答案:

答案 0 :(得分:4)

你非常想过这个。如果你担心在这个级别进行优化,那么Python并不是你应该使用的语言。

那就是说,整个Python的容器知道自己的长度,而不必迭代。内置类型是用C实现的(在CPython实现中),我必须深入研究实际代码,以确切了解它的实现位置,但len始终是一个恒定时间调用。 / p>