获取Python中整数所需的大小(以字节为单位)



如何找出某个整数存储所需的字节数?

例如,对于

  • 十六进制x00-xff(或十进制0-255=二进制0000 0000-1111 1111(我想得到1(字节(
  • 十六进制x100-xffff(或十进制256-65535=二进制0000 0001 0000 0000-1111 1111 1111 1111(将给我2(字节(

等等

有十六进制或十进制作为输入的线索吗?

def byte_length(i):
    return (i.bit_length() + 7) // 8

当然,正如Jon Clements所指出的,这并不是实际PyIntObject的大小,它有一个PyObject头,并以最容易处理的方式而不是最紧凑的方式将值存储为bignum,并且必须在实际对象的顶部至少有一个指针(4或8字节(,依此类推

但这是数字本身的字节长度。这几乎可以肯定是最有效的答案,也可能是最容易阅读的答案。

还是ceil(i.bit_length() / 8.0)可读性更强?

除非您处理的是array.arraynumpy.array,否则大小总是有对象开销。由于Python与BigInts打交道很自然,所以很难判断。。。

>>> i = 5
>>> import sys
>>> sys.getsizeof(i)
24

因此,在64位平台上,它需要24个字节来存储可以存储在3位中的内容。

但是,如果你这样做了,

>>> s = 'x05'
>>> sys.getsizeof(s)
38

所以,不,不是真的——你有object定义的内存开销,而不是原始存储。。。

如果你然后采取:

>>> a = array.array('i', [3])
>>> a
array('i', [3])
>>> sys.getsizeof(a)
60L
>>> a = array.array('i', [3, 4, 5])
>>> sys.getsizeof(a)
68L

然后你会得到所谓的正常字节边界,等等…等等…

如果您只想存储"纯粹"的内容-减去对象开销,那么从2.(6|7(开始,您可以使用some_int.bit_length()(否则,只需像其他答案所示那样对其进行位移(,然后从那里开始工作

您可以使用简单的数学:

>>> from math import log
>>> def bytes_needed(n):
...     if n == 0:
...         return 1
...     return int(log(n, 256)) + 1
...
>>> bytes_needed(0x01)
1
>>> bytes_needed(0x100)
2
>>> bytes_needed(0x10000)
3

通过使用一个简单的双向操作,每次将所有使用的位移动到1个字节以上,您可以看到存储一个数字需要多少字节。

可能值得注意的是,虽然这种方法非常通用,但它不适用于负数,只查看变量的二进制值,而不考虑它存储在什么中。

a = 256
i = 0
while(a > 0):
    a = a >> 8;
    i += 1;
print (i)

程序的行为如下:

a是二进制的0000 0001 0000 0000循环的每次运行都会将其向左移动8:

loop 1:
0000 0001 >> 0000 0000
0000 0001 > 0 (1 > 0)
loop 2:
0000 0000 >> 0000 0001
0000 0000 > 0 (0 > 0)
END 0 is not > 0

因此需要2个字节来存储该数字。

在python命令提示符下,您可以使用函数的大小

**$ import python 
$ import ctypes
$ ctypes.sizeof(ctypes.c_int)**
# Python 3
import math
nbr = 0xff                 # 255 defined in hexadecimal
nbr = "{0:b}".format(nbr)    # Transform the number into a string formated as bytes.
bit_length = len(nbr)      # Number of characters
byte_length = math.ceil( bit_length/8 ) # Get minimum number of bytes

相关内容

  • 没有找到相关文章

最新更新