我的问题是:这些模式(下面)在哪里产生?
我学到了(某处)Python有独特的"副本",如果这是正确的单词,对于小整数.例如:
>>> x = y = 0
>>> id(0)
4297074752
>>> id(x)
4297074752
>>> id(y)
4297074752
>>> x += 1
>>> id(x)
4297074728
>>> y
0
Run Code Online (Sandbox Code Playgroud)
当我查看整数的内存位置时,早期有一个简单的模式:
>>> N = id(0)
>>> for i in range(5):
... print i, N - id(i)
...
0 0
1 24
2 48
3 72
4 96
>>> bin(24)
'0b11000'
Run Code Online (Sandbox Code Playgroud)
我不清楚为什么选择这个作为增量.而且,我无法解释256以上的这种模式:
>>> prev = 0
>>> for i in range(270):
... t = (id(i-1), id(i))
... diff = t[0] - t[1]
... if diff != prev:
... print i-1, i, t, diff
... prev = diff
...
-1 0 (4297074776, 4297074752) 24
35 36 (4297073912, 4297075864) -1952
36 37 (4297075864, 4297075840) 24
76 77 (4297074904, 4297076856) -1952
77 78 (4297076856, 4297076832) 24
117 118 (4297075896, 4297077848) -1952
118 119 (4297077848, 4297077824) 24
158 159 (4297076888, 4297078840) -1952
159 160 (4297078840, 4297078816) 24
199 200 (4297077880, 4297079832) -1952
200 201 (4297079832, 4297079808) 24
240 241 (4297078872, 4297080824) -1952
241 242 (4297080824, 4297080800) 24
256 257 (4297080464, 4297155264) -74800
257 258 (4297155072, 4297155288) -216
259 260 (4297155072, 4297155336) -264
260 261 (4297155048, 4297155432) -384
261 262 (4297155024, 4297155456) -432
262 263 (4297380280, 4297155384) 224896
263 264 (4297155000, 4297155240) -240
264 265 (4297155072, 4297155216) -144
266 267 (4297155072, 4297155168) -96
267 268 (4297155024, 4297155144) -120
Run Code Online (Sandbox Code Playgroud)
有什么想法,线索,看的地方吗?
编辑:24有什么特别之处?
更新:标准库具有作为参数调用时sys.getsizeof()返回的标准库.这是很多字节,但在64位机器上,我们有8个字节,分别用于类型,值和引用计数.此外,看到这里,和C API参考这里.241
花了一些时间与Peter Hansen在评论中链接中的"来源".找不到int的定义(超出声明*int_int),但我确实发现:
#define NSMALLPOSINTS 257
#define NSMALLNEGINTS 5
Run Code Online (Sandbox Code Playgroud)
预值分配低值整数,计算高值整数.源代码中出现的整数是同一个对象.在我的系统上,
>>> id(2) == id(1+1)
True
>>> id(1000) == id(1000+0)
False
>>> id(1000) == id(1000)
True
Run Code Online (Sandbox Code Playgroud)
您还会注意到ID取决于系统.它们只是内存地址,由系统分配器(或可能是链接器)为静态对象分配?
>>> id(0)
8402324
Run Code Online (Sandbox Code Playgroud)
编辑:原因id(1000) == id(1000)是因为Python编译器注意到它编译的代码中的两个整数常量是相同的,所以它只为两者分配一个对象.这在运行时会遇到令人无法接受的性能损失,但在编译时它并不明显.(是的,解释器也是一个编译器.大多数解释器也是编译器,很少有解释器.)
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |