【发布时间】:2017-03-13 20:14:36
【问题描述】:
我需要加速下面的代码:
for i in range(0, 2**N):
output[i] = f(np.array(map(int, bin(i)[2:].zfill(N))))
N 大约是30,所以代码很慢(在我的笔记本电脑上大约需要 33 小时)。函数f() 的参数是索引i 的二进制表示,f() 可以是任意向量化函数。我不是专家,但为了加快代码速度,我想摆脱for 循环,这意味着我需要对f() 的参数进行矢量化处理。换句话说,我必须用从0 到2**N 的数字的二进制表示创建一个矩阵。这可以通过以下代码实现:
list(itertools.product([0, 1], repeat=N))
我在this link 找到的。但是,在我看来itertools 非常慢,显然它需要大量内存,因为2**30 大约是十亿。
您对加快此代码的速度有什么建议吗?提前致谢。
【问题讨论】:
-
除了
output的最后一个值之外,您似乎正在丢弃所有值。 -
与其生成十亿元素数组,不如重写为生成器?
-
查找生成器和
yield命令。 -
另外,如果您使用的是 Python 2.7,请务必使用 "xrange" ,而不是 "range" - 仅此一项就会在系统内存中创建 2 ^30 个对象。
-
你真的在使用所有十亿的值吗?你能在调用时生成每个值和then store that value if it is called again吗?
标签: python performance loops