【问题标题】:Does the len() built-in function iterates through the collection to calculate its length, or does it access a collection's attribute? [duplicate]len() 内置函数是遍历集合以计算其长度,还是访问集合的属性? [复制]
【发布时间】:2015-05-17 09:44:48
【问题描述】:

Python 有很多built-in functionslen() 就是其中之一。

返回对象的长度(项目数)。参数可以是序列(如字符串、字节、元组、列表或范围)或集合(如字典、集合或冻结集)。

如果集合和序列是对象,它们可以包含一个length 属性,该属性可以在每次发生变化时更新。访问此属性将是检索集合长度的快速方法。

另一种方法是遍历集合并动态计算项目数。

len() 如何计算所说的长度?通过迭代或属性访问?一种,没有,两种,其他方法?

【问题讨论】:

标签: python python-internals


【解决方案1】:

Python 内置集合在属性中缓存长度。使用len() 不会遍历所有元素来计算它们,不。

将长度作为一个属性保持成本低廉且易于维护。鉴于 Python 内置的集合类型被如此广泛地使用,他们这样做是不明智的。

具有长度的 Python 内置类型通常构建在 PyObject_VAR_HEAD struct 之上,其中包括一个 ob_size 条目。然后可以使用Py_SIZE macro 来实现object.__len__ method(例如PySequenceMethods.sq_length slot in the C-API)。例如,请参阅listobject.c implementation for list_length

【讨论】:

  • 有时,集合的长度与其迭代器的长度不同。例如。 pandas DataFrame 返回行数作为长度,而它的迭代器迭代列!
  • @kadee:所以?您还可以迭代 Pandas 中的行,以及其他几个迭代来引导。这与指定长度有什么关系?
  • @kadee(如果您需要知道列数,请使用len(dataframe.columns))。
  • 这意味着@Jamm 提出的“遍历集合并计算项目数”将产生与 len() 给出的不同结果。换句话说,len(dataframe) != len(list(dataframe.__iter__())) 我发现这很了不起。
猜你喜欢
  • 2018-11-17
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多