Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能用更少的内存来保存一位数字吗?_Python_Python 3.x_Memory - Fatal编程技术网

Python 我能用更少的内存来保存一位数字吗?

Python 我能用更少的内存来保存一位数字吗?,python,python-3.x,memory,Python,Python 3.x,Memory,我知道Python不是最好的内存管理语言,但是有没有一种方法可以将较小的数字存储到比整数更小的内存中呢 我目前正在使用宽度优先搜索的Python程序中工作,我在类中使用了一个参数,该参数的值只能为0到9。我希望尽可能有效地存储它,因为如果我的大小是1B或3B,那么当您必须在运行内存中处理数千个变量时,这一点很重要。对于本机python代码,您不能这样做,因为python的int是硬编码的,需要24个字节来支持长整数。这是有效的,因为在您的情况下,函数参数接受一位数 但如果您还记得C有一个解决方案

我知道Python不是最好的内存管理语言,但是有没有一种方法可以将较小的数字存储到比整数更小的内存中呢


我目前正在使用宽度优先搜索的Python程序中工作,我在类中使用了一个参数,该参数的值只能为0到9。我希望尽可能有效地存储它,因为如果我的大小是1B或3B,那么当您必须在运行内存中处理数千个变量时,这一点很重要。

对于本机python代码,您不能这样做,因为python的
int
是硬编码的,需要24个字节来支持长整数。这是有效的,因为在您的情况下,函数参数接受一位数

但如果您还记得C有一个解决方案,那么C中的无符号字符取1字节,数字范围为
0-255

因此,在python中,它将如下所示

>>从ctypes导入cUubyte
>>>十=立方(10)
>>>十
尤比特(10)
>>>类型(十)
>>>10.价值
10
>>>类型(10.值)
>>> 

不确定这是否真的值得,但您始终可以使用4位对
[0,1,…,9]
中的整数进行编码,并将其中几个整数存储在python
int
中。然后,打包和解包是一些位移位和掩蔽:

SHIFT = 4
MASK = 0xf

integers = [0, 1, 5, 3]

# pack list into int
store = 0
for i in integers:
    store <<= SHIFT
    store ^= i

# unpack list from int
unpacked = []
for _ in range(len(integers)):
    unpacked.append(store & MASK)
    store >>= SHIFT
unpacked.reverse()

assert integers == unpacked
SHIFT=4
掩码=0xf
整数=[0,1,5,3]
#将列表打包为int
存储=0
对于整数形式的i:
商店=班次
打开包装。反向()
断言整数==未打包

该模块可能也很有用。

在几千个对象上,您仍然可以在KB范围内。除非您运行在资源非常有限的平台上,否则这不会有太大区别这是嵌入式系统吗?大多数情况下,一个正则整数足够小而不用担心。在CPython中,小整数被缓存。因此,只有指针的开销,8字节。但是,如果您想存储许多小整数,可以使用
array.array
甚至
numpy
来存储
ctypes
包装器是否没有任何内存开销?在我的系统中,
ctypes.c_ubyte
值的开销远远大于普通的
int
。这只有在使用相当大的ubyte数组时才有助于节省内存,这样所有值只有一个开销实例。