到目前为止,当我将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次(首先是字典理解,第二次是长度计算)。
请启发我。
答案 0 :(得分:4)
你非常想过这个。如果你担心在这个级别进行优化,那么Python并不是你应该使用的语言。
那就是说,整个Python的容器做知道自己的长度,而不必迭代。内置类型是用C实现的(在CPython实现中),我必须深入研究实际代码,以确切了解它的实现位置,但len
始终是一个恒定时间调用。 / p>