use*_*638 8 python performance loops
我需要加快以下代码:
for i in range(0, 2**N):
output[i] = f(np.array(map(int, bin(i)[2:].zfill(N))))
Run Code Online (Sandbox Code Playgroud)
N周围30,因此代码非常慢(我的笔记本电脑需要大约33个小时).函数的参数f()是索引的二进制表示i,并且f()可以是任意可向量化的函数.我不是专家,但为了加速代码,我想要摆脱for循环,这意味着我需要对参数进行矢量化f().换句话说,我要创建与数字从二进制表示的矩阵0来2**N.这可以通过以下代码实现:
list(itertools.product([0, 1], repeat=N))
Run Code Online (Sandbox Code Playgroud)
我在这个链接上找到了.然而,在我看来,这itertools是非常缓慢的,显然它需要大量的记忆,因为2**30大约十亿.
你有什么建议让这段代码更快吗?提前致谢.
总是简介:
>>> 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
Run Code Online (Sandbox Code Playgroud)
您可以看到该itertools.product方法相当快,因为它不必摆弄字符串.
问题可能是大部分时间都花在了f函数上.
另一种解决方案可能是f接受一个整数,并将其用作二进制字段.