加快numpy.asarray的计算速度

时间:2017-09-29 03:20:10

标签: python-2.7 numpy

我给出了以下代码,它生成随机整数并将它们转换为二进制表示:

import sys
import random
import numpy

num = 500000
M = list(set([random.randint(0, 2 ** 64) for i in range(num)]))
M = [('{0:016b}').format(i) for i in M]
M = numpy.asarray([list(map(int, list(i))) for i in M])

num可以是100万到2000万之间的任何值。您可能会注意到,最后一行M = np.asarray([list(map(int, list(i))) for i in M])是计算时间最长的地方。我怎样才能加快速度?任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

使用num=5,您的代码会生成

In [62]: M
Out[62]: 
array([ list([1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0]),
       list([1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1]),
       list([1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1]),
       list([1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]),
       list([1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0])], dtype=object)
In [63]: M.shape
Out[63]: (5,)
In [64]: len(M[0])
Out[64]: 64
In [65]: [len(m) for m in M]
Out[65]: [64, 64, 64, 62, 64]

M是一个1d对象数组,基本上是一个美化/贬值的列表。组件是列表。它们的长度不同,因此数组不能是2d(整数)。

最后一行中的大部分时间都在列表理解中,而不是asarray调用。