如何从整数值加速二进制转换

时间:2018-03-12 01:46:08

标签: python python-2.7

我编写了以下方法(在python 2.7中),它生成一组整数并将它们转换为二进制表示。它需要不言自明的两个参数:total_num_nodesdim。它返回numpy matrix-like,包含所有这些整数的二进制表示:

def generate(total_num_nodes, dim):

    # Generate random nodes from the range (0, dim-1) 
    nodes_matrix = [random.randint(0, 2 ** dim - 1) for _ in range(total_num_nodes)]

    # Removes duplicates
    nodes_matrix = list(set(nodes_matrix))

    # Transforms each node from decimal to string representation
    nodes_matrix = [('{0:0' + str(dim) + 'b}').format(x) for x in nodes_matrix]

    # Transforms each bit into an integer.
    nodes_matrix = np.asarray([list(map(int, list(x))) for x in nodes_matrix], dtype=np.uint8)

    return nodes_matrix

问题在于,当我传递非常大的值时,比如total_num_nodes= 10,000,000dim=128,生成时间需要很长时间。我的一个朋友告诉我,以下行实际上是一个瓶颈,它可能是大部分计算时间的原因:

# Transforms each node from decimal to string representation
nodes_matrix = [('{0:0' + str(dim) + 'b}').format(x) for x in nodes_matrix]

我想不出能够重新启动此行的其他更快的方法,以便在单个处理器上运行时加快生成时间。你的任何建议真的很感激。

谢谢

1 个答案:

答案 0 :(得分:1)

在numpy中做到这一切并且会更快。

以下内容生成total_num_nodesdimnp.uint8数据,然后通过提供适合np.unique的数据视图来保留唯一行,然后翻译回来到2D数组:

import numpy as np

def generate(total_num_nodes, dim):
    a = np.random.choice(np.array([0,1],dtype=np.uint8),size=(total_num_nodes,dim))
    dtype = a.dtype.descr * dim
    temp = a.view(dtype)
    uniq = np.unique(temp)
    return uniq.view(a.dtype).reshape(-1,dim)