2024-04-26 21:14:16 发布
网友
为什么
sys.getrefcount()
每个大数或简单字符串都返回3?这是否意味着程序中有3个对象?另外,为什么设置x=(非常大的数字)不增加对象的ref计数?这3个ref count是我调用getrefcount的结果吗? 谢谢你澄清这一点。在
例如:
Python缓存小字符串和整数,以节省对象构建成本。
交互式Python解释器保存对您输入的每个文本的临时引用。比较getrefcount('foobar')与{}。(在后一种情况下,解释器引用了'foo'和{}。)
getrefcount('foobar')
'foo'
来自manual:
The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().
getrefcount()
解释程序不会重用大整数对象,因此可以得到两个不同的对象:
>>> a = 11111 >>> b = 11111 >>> id(a) 40351656 >>> id(b) 40351704
在系统获取引用计数(11111)总是返回相同的数字,因为它测量新对象的引用计数。在
对于小整数,Python总是重用同一个对象:
通常您只能得到一个对新对象的引用:
>>> sys.getrefcount(object()) 1
但是,为了性能优化,Python在一个特殊的pre-maloced区域分配了整数,我怀疑额外的两个引用与此有关。在
您可以在这里查看C实现:http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup
编辑:我并不声称了解底层细节中发生了什么,我认为有几件事在起作用,缓存临时引用:
print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 print sys.getrefcount(111111111111 + 2222222222222) #2 print sys.getrefcount('foobar333333333333333333') #3
Python缓存小字符串和整数,以节省对象构建成本。
交互式Python解释器保存对您输入的每个文本的临时引用。比较}。(在后一种情况下,解释器引用了}。)
getrefcount('foobar')
与{'foo'
和{来自manual:
解释程序不会重用大整数对象,因此可以得到两个不同的对象:
在系统获取引用计数(11111)总是返回相同的数字,因为它测量新对象的引用计数。在
对于小整数,Python总是重用同一个对象:
^{2}$通常您只能得到一个对新对象的引用:
但是,为了性能优化,Python在一个特殊的pre-maloced区域分配了整数,我怀疑额外的两个引用与此有关。在
您可以在这里查看C实现:http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup
编辑:我并不声称了解底层细节中发生了什么,我认为有几件事在起作用,缓存临时引用:
相关问题 更多 >
编程相关推荐