关于python:如何加速这两行代码?

How can I speed up this two-lines code?

我需要加速以下代码:

1
2
3
for i in range(0, 2**N):

    output[i] = f(np.array(map(int, bin(i)[2:].zfill(N))))

N30附近,因此代码非常慢(在我的笔记本电脑上大约需要33小时)。函数f()的参数是索引i的二进制表示,f()可以是任意可向量函数。我不是专家,但为了加快代码的速度,我想去掉for循环,这意味着我需要向量化f()的论点。换句话说,我必须用从02**N的数字的二进制表示来创建一个矩阵。这可以通过以下代码实现:

1
list(itertools.product([0, 1], repeat=N))

我在这个链接上找到的。然而,在我看来,itertools的速度非常慢,而且很明显,由于2**30大约有10亿,它需要大量的内存。

你有什么建议可以让这段代码更快吗?事先谢谢。


简介:总是

1
2
3
4
>>> 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

你可以看到,这是considerably itertools.product方法更快,因为它不与已在弦的小提琴。

问题是,大多数的时间是花在f功能虽然。

另一个解决方案可以让f在接受和使用它作为一个整数的二进制字段。