我怎样才能加快这两行代码的速度?

时间:2016-10-31 17:30:41

标签: python performance loops

我需要加快以下代码:

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的数字的二进制表示。这可以通过以下代码实现:

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

我在this link找到了。但是,在我看来,itertools非常慢,显然需要大量记忆,因为2**30大约是10亿。

你有什么建议让这段代码更快吗?提前谢谢。

1 个答案:

答案 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接受一个整数,并将其用作二进制字段。