【发布时间】:2016-04-01 20:02:02
【问题描述】:
我需要创建一个包含随机布尔值的大型 numpy 数组,而不会点击交换。
我的笔记本电脑有 8 GB 的 RAM。创建一个(1200, 2e6) 数组需要不到 2 秒的时间并使用 2.29 GB 的 RAM:
>>> dd = np.ones((1200, int(2e6)), dtype=bool)
>>> dd.nbytes/1024./1024
2288.818359375
>>> dd.shape
(1200, 2000000)
对于相对较小的(1200, 400e3),np.random.randint 仍然相当快,大约需要 5 秒来生成一个 458 MB 的数组:
db = np.array(np.random.randint(2, size=(int(400e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'
但是,如果我将数组的大小加倍到 (1200, 800e3),我会点击交换,创建 db 需要大约 2.7 分钟;(
cmd = """
import numpy as np
db = np.array(np.random.randint(2, size=(int(800e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'"""
print timeit.Timer(cmd).timeit(1)
使用random.getrandbits 需要更长的时间(~8 分钟),并且还使用交换:
from random import getrandbits
db = np.array([not getrandbits(1) for x in xrange(int(1200*800e3))], dtype=bool)
将np.random.randint 用于(1200, 2e6) 只会给出MemoryError。
有没有更有效的方法来创建(1200, 2e6) 随机布尔数组?
【问题讨论】:
标签: python performance numpy random boolean