python中的高内存使用率

python中的高内存使用率,python,performance,memory,memory-management,Python,Performance,Memory,Memory Management,下面是简单的python代码: class Node: NumberOfNodes = 0 def __init__(self): Node.NumberOfNodes += 1 if __name__ == '__main__': nodes = [] for i in xrange(1, 7 * 1000 * 1000): if i % 1000 == 0: print i nodes.a

下面是简单的python代码:

class Node:
    NumberOfNodes = 0
    def __init__(self):
        Node.NumberOfNodes += 1
if __name__ == '__main__':
    nodes = []
    for i in xrange(1, 7 * 1000 * 1000):
        if i % 1000 == 0:
            print i
        nodes.append(Node())
占用千兆字节的内存; 我认为这是不合理的。这在python中正常吗


我如何解决这个问题?(在我的原始代码中,我有大约700万个对象,每个对象有10个字段,需要8 GB的RAM)

如果您有固定数量的字段,那么您可以使用
\uuuuu插槽来节省大量内存。请注意,
\uuuuuuu插槽\uuuuuuu
确实有一些限制,因此在选择在应用程序中使用它们之前,请确保仔细阅读:

>>> import sys
>>> class Node(object):
    NumberOfNodes = 0
    def __init__(self):
        Node.NumberOfNodes += 1
...         
>>> n = Node()
>>> sys.getsizeof(n)
64
>>> class Node(object):
    __slots__ = ()
    NumberOfNodes = 0
    def __init__(self):
        Node.NumberOfNodes += 1
...         
>>> n = Node()
>>> sys.getsizeof(n)
16

如果您有固定数量的字段,那么您可以使用
\uuuuu插槽\uuuu
来节省大量内存。请注意,
\uuuuuuu插槽\uuuuuuu
确实有一些限制,因此在选择在应用程序中使用它们之前,请确保仔细阅读:

>>> import sys
>>> class Node(object):
    NumberOfNodes = 0
    def __init__(self):
        Node.NumberOfNodes += 1
...         
>>> n = Node()
>>> sys.getsizeof(n)
64
>>> class Node(object):
    __slots__ = ()
    NumberOfNodes = 0
    def __init__(self):
        Node.NumberOfNodes += 1
...         
>>> n = Node()
>>> sys.getsizeof(n)
16

Python是一种固有的内存密集型编程语言。有一些方法可以解决这个问题<代码>插槽是一种方式。另一种更极端的方法是使用numpy存储数据。您可以使用numpy创建结构化数组或记录——这是一种使用最少内存的复杂数据类型,但与普通python类相比,它的功能损失很大。也就是说,您使用的是numpy数组类,而不是您自己的类——您不能在数组上定义自己的方法

import numpy as np

# data type for a record with three 32-bit ints called x, y and z
dtype = [(name, np.int32) for name in 'xyz']
arr = np.zeros(1000, dtype=dtype)
# access member of x of a record
arr[0]['x'] = 1 # name based access
# or
assert arr[0][0] == 1 # index based access
# accessing all x members of records in array
assert arr['x'].sum() == 1
# size of array used to store elements in memory
assert arr.nbytes == 12000 # 1000 elements * 3 members * 4 bytes per int

请参阅更多。

Python是一种固有的内存密集型编程语言。有一些方法可以解决这个问题<代码>插槽是一种方式。另一种更极端的方法是使用numpy存储数据。您可以使用numpy创建结构化数组或记录——这是一种使用最少内存的复杂数据类型,但与普通python类相比,它的功能损失很大。也就是说,您使用的是numpy数组类,而不是您自己的类——您不能在数组上定义自己的方法

import numpy as np

# data type for a record with three 32-bit ints called x, y and z
dtype = [(name, np.int32) for name in 'xyz']
arr = np.zeros(1000, dtype=dtype)
# access member of x of a record
arr[0]['x'] = 1 # name based access
# or
assert arr[0][0] == 1 # index based access
# accessing all x members of records in array
assert arr['x'].sum() == 1
# size of array used to store elements in memory
assert arr.nbytes == 12000 # 1000 elements * 3 members * 4 bytes per int

查看更多信息。

我们可以查看原始代码吗?因此每个对象大约占用1K内存。它们是什么类型的字段?我只是简化了它。还有10个整数字段,我用零初始化它们。我认为这并不重要。C中的同一代码大约需要(4*7000000字节<30MB)我们能看到原始代码吗?因此每个对象大约需要1K内存。它们是什么类型的字段?我只是简化了它。还有10个整数字段,我用零初始化它们。我认为这并不重要。C中的相同代码应该需要大约(4*7000000字节<30MB)非常感谢,我试过了,内存使用量变成了1.5Gbs(原来是8GBs)。但正如我在评论中所说,等效的C程序应该需要大约300MB。这意味着python占用了5倍的内存。普通类的大小实际上也应该包括它的
\uuu dict\uu
的大小。例如,
sys.getsizeof(n)+sys.getsizeof(vars(n))
<代码> GETSIZOOS//COD>不把DICT的大小作为它的单独对象。Python中的“法拉姆井”是对象,包括类、整数等。虽然这不是C/C++的。@ AsWiCiHaDuHayi,但是即使在C++中使用类,也没有什么明显的差异(与Python的区别)。那么python在这些额外的记忆中储存了什么呢?@Dunes噢!是的,第二个插槽的大小是
\uuuuuuuuuuuuuuuuuuuuuu
。非常感谢,我试过了,内存使用量变成了1.5Gbs(原来是8GBs)。但正如我在评论中所说,等效的C程序应该需要大约300MB。这意味着python占用了5倍的内存。普通类的大小实际上也应该包括它的
\uuu dict\uu
的大小。例如,
sys.getsizeof(n)+sys.getsizeof(vars(n))
<代码> GETSIZOOS//COD>不把DICT的大小作为它的单独对象。Python中的“法拉姆井”是对象,包括类、整数等。虽然这不是C/C++的。@ AsWiCiHaDuHayi,但是即使在C++中使用类,也没有什么明显的差异(与Python的区别)。那么python在这些额外的记忆中储存了什么呢?@Dunes噢!是的,如果是第二个插槽,则为
\uuuuuuuuuuuu
的大小。