我需要加快以下代码的执行速度:
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))
我在这个链接上找到了相关的信息,但是我觉得itertools
非常缓慢,并且由于2**30
约等于十亿,它显然需要大量的内存。
你有什么建议可以让这段代码运行得更快吗?谢谢提前。
['do something' for i in ...]
。 - oliversmf
的计算成本很高,可能没有太多可以做的。如果单个函数评估需要花费例如 1/10 毫秒,并且您正在进行超过十亿次这样的评估,则无论如何都需要大约 30 小时。也许您可以重构,以便f
所做的计算直接在循环中实现。至少这将节省十亿个函数调用的开销。 - John Coleman