在Python中获取整数的大小

std*_*err 13 python byte numbers

我如何找出一个特定数字需要存储的字节数,例如\ x00 - \xFF我希望获得1(字节),\ x100 - \xffff会给我2(字节)等等.任何线索?

Jon*_*nts 24

除非你正在处理一个array.array或一个numpy.array- 大小总是有对象开销.由于Python自然地与BigInts打交道,所以真的,真的很难说......

>>> i = 5
>>> import sys
>>> sys.getsizeof(i)
24
Run Code Online (Sandbox Code Playgroud)

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

但是,如果你这样做了,

>>> s = '\x05'
>>> sys.getsizeof(s)
38
Run Code Online (Sandbox Code Playgroud)

所以不,不是真的 - 你已经得到了内存开销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
Run Code Online (Sandbox Code Playgroud)

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

如果你只是想要存储"纯粹"的东西 - 减去对象开销,那么从2.(6 | 7)你可以使用some_int.bit_length()(否则只是按照其他答案显示的位移)然后从那里工作


aba*_*ert 16

def byte_length(i):
    return (i.bit_length() + 7) // 8
Run Code Online (Sandbox Code Playgroud)

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

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

或者ceil(i.bit_length() / 8.0)更具可读性?

  • 无论是谁贬低了这个,都要小心解释原因?(字节长度与位长度有什么关系,或者内置的`bit_length`方法有什么作用,或其他什么不明显?) (2认同)

str*_*nac 7

你可以使用简单的数学:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 应该对`0`进行测试,因为`log`无法处理. (3认同)