我正在使用非常高维的向量进行机器学习,并且正在考虑使用 numpy 来减少使用的内存量。我运行了一个快速测试,看看使用 numpy (1)(3) 可以节省多少内存:
标准清单
import random
random.seed(0)
vector = [random.random() for i in xrange(2**27)]
numpy 数组
import numpy
import random
random.seed(0)
vector = numpy.fromiter((random.random() for i in xrange(2**27)), dtype=float)
内存使用 (2)
Numpy array: 1054 MB
Standard list: 2594 MB
正如我所料。
通过使用本机浮点数分配一个连续的内存块,numpy 仅消耗标准列表正在使用的内存的大约一半。
因为我知道我的数据非常空闲,所以我对稀疏数据进行了相同的测试。
标准清单
import random
random.seed(0)
vector = [random.random() if random.random() < 0.00001 else 0.0 for i in xrange(2 ** 27)]
numpy 数组
from numpy import fromiter
from random import random
random.seed(0)
vector = numpy.fromiter((random.random() if random.random() < 0.00001 else 0.0 for i in xrange(2 ** 27)), dtype=float)
内存使用 (2)
Numpy array: 1054 MB
Standard list: 529 MB
现在突然之间,python 列表使用了 numpy 数组使用的内存量的一半!为什么?
One thing I could think of is that python dynamically switches to a dict representation when it detects that it contains very sparse data. Checking this could potentially add a lot of extra run-time overhead so I don't really think that this is going on.
Notes
- I started a fresh new python shell for every test.
- Memory measured with htop.
- Run on 32bit Debian.