23

如何找出某个整数占用的存储字节数?

例如对于

  • 十六进制\x00- \xff(或十进制0- 255= 二进制0000 0000- 1111 1111)我希望得到 1(字节),
  • 十六进制\x100- \xffff(或十进制256- 65535= 二进制0000 0001 0000 0000- 1111 1111 1111 1111)会给我 2(字节)

等等。

十六进制或十进制格式作为输入的任何线索?

4

6 回答 6

30

除非您正在处理 anarray.array或 a numpy.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()(否则只需将其移位,如其他答案所示),然后从那里开始工作

于 2013-01-15T01:38:37.967 回答
28
def byte_length(i):
    return (i.bit_length() + 7) // 8

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

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

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

于 2013-01-15T01:48:07.440 回答
12

您可以使用简单的数学:

>>> 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
于 2013-01-15T01:39:25.387 回答
4

通过使用简单的二元运算将所有使用的位每次移动超过 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个字节来存储数字。

于 2013-01-15T01:37:18.137 回答
1

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

**$ import python 
$ import ctypes
$ ctypes.sizeof(ctypes.c_int)**
于 2015-01-12T11:07:37.540 回答
0
# 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
于 2016-04-19T19:39:18.340 回答