如何找出某个数字需要存储的字节数,例如for \ x00 - \ xFF我希望得到1(字节),\ x100 - \ xffff会给我2(字节)等等。任何线索?
答案 0 :(得分:23)
除非您正在处理array.array
或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()
(否则只是按照其他答案显示的位移)然后工作从那里
答案 1 :(得分:16)
def byte_length(i):
return (i.bit_length() + 7) // 8
当然,正如Jon Clements指出的那样,这不是具有PyObject标头的实际PyIntObject
的大小,并且以任何最容易处理的方式将值存储为bignum而不是最紧凑的,你必须在实际对象的顶部至少有一个指针(4或8个字节),依此类推。
但这是数字本身的字节长度。这几乎肯定是最有效的答案,也可能是最容易阅读的答案。
或ceil(i.bit_length() / 8.0)
更具可读性?
答案 2 :(得分: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
答案 3 :(得分: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个字节。
答案 4 :(得分:0)
在python命令提示符下,您可以使用函数的大小
**$ import python
$ import ctypes
$ ctypes.sizeof(ctypes.c_int)**
答案 5 :(得分: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