繁体   English   中英

为什么小整数缓存似乎不适用于 Python 3 中 round() 函数中的 int 对象?

[英]Why doesn't small integer caching seem to work with int objects from the round() function in Python 3?

你能解释一下为什么在 Python v3.8 中会发生这种情况吗?

a=round(2.3)
b=round(2.4)

print(a,b)
print(type(a),type(b))

print(a is b)
print(id(a))
print(id(b))

输出:

2 2
<class 'int'> <class 'int'>
False
2406701496848
2406701496656
>>>

2 在小整数缓存的范围内。 那么为什么会有不同的对象具有相同的值呢?

看起来在 3.8 中, PyLong_FromDouble (这是float.__round__最终委托给的) 显式分配一个新的PyLong对象并手动填充它,而不对其进行规范化(通过IS_SMALL_INT检查和get_small_int缓存查找函数),因此它不检查解析为规范值的小型int缓存。

由于问题 37986:提高 PyLong_FromDouble() 的性能,这将在 3.9 中发生变化,当double小到足以无损地表示为 C long时,现在将其委托给PyLong_FromLong 作为副作用,这将使用 small int缓存,因为PyLong_FromLong可靠地对小值进行标准化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM