我需要加快以下代码:
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
大约是10亿。
你有什么建议让这段代码更快吗?提前谢谢。
答案 0 :(得分:6)
始终简介:
>>> timeit.timeit("for i in range(0, 2**N): numpy.array(map(int, bin(i)[2:].zfill(N)))", "import numpy; N=5", number=100000)
26.472519159317017
>>> timeit.timeit("for t in itertools.product((0, 1), repeat=N): numpy.array(t)", "import numpy, itertools; N=5", number=100000)
6.129688024520874
你可以看到itertools.product
方法相当快,因为它不需要乱用字符串。
问题可能是大部分时间花在f
功能上。
另一种解决方案可能是让f
接受一个整数,并将其用作二进制字段。