您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么列表询问__len__?

为什么列表询问__len__?

请参阅PEP 424的“基本原理”部分,部分介绍__length_hint__并提供了有关动机的见解:

能够根据预期大小(由估算)预先分配列表__length_hint__可能是一项重大优化。观察到cpython比PyPy运行某些代码快,完全是因为存在这种优化。

除此之外,用于的文档object.__length_hint__验证了这纯粹是一项优化功能

叫执行operator.length_hint()。应该返回对象的估计长度(可以大于或小于实际长度)。长度必须是整数>= 0方法 ,对于正确性从来不需要

__length_hint__之所以如此,是因为它可以带来一些不错的优化。

PyObject_LengthHint首先尝试从中获取值object.__len__ (如果已定义),然后尝试查看是否object.__length_hint__可用。如果两者都不存在,则返回8for列表的认值。

listextend``list_init如Eli在其答案中所述被调用,根据此PEP进行了修改,以为定义a__len__或a的任何内容提供此优化__length_hint__

list不是唯一受益于此的bytes对象对象当然可以这样做

>>> bytes(Foo())
len
getitem 0
...
b'\x00\x01\x04\t\x10\x19'

对象也是如此bytearray但只有当您使用extend它们时

>>> bytearray().extend(Foo())
len
getitem 0
...

tuple创建中间序列以填充自身的对象:

>>> tuple(Foo())
len
getitem 0
...
(0, 1, 4, 9, 16, 25)

如果有人在徘徊,为什么在上课 之前 而不是在上课之后'iter'打印确切的内容: __'len'``Bar``Foo

这是因为如果手中的对象定义了__iter__ Python, 则将首先调用它 来获取迭代器,从而也运行它print('iter')。如果回到使用,则不会发生相同的情况__getitem__

其他 2022/1/1 18:38:23 有408人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶