python中的高内存使用率

时间:2015-01-07 23:41:29

标签: 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.append(Node())

需要几千兆字节的内存; 我认为这是不合理的。在python中这是正常的吗?

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

2 个答案:

答案 0 :(得分:3)

如果您有固定数量的字段,那么您可以使用__slots__来节省大量内存。请注意,__slots__确实存在一些限制,因此请务必仔细阅读Notes on using __slots__,然后再选择在您的应用中使用它们:

>>> 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

答案 1 :(得分:1)

Python本质上是一种内存繁重的编程语言。有一些方法可以解决这个问题。 __slots__是一种方式。另一种更极端的方法是使用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

查看更多here