两个整数的二进制表示形式的统一重组

时间:2019-03-13 15:18:30

标签: python performance numpy numba

我需要快速实现以下问题,最好将其作为numba函数。我从名为a的列表中选取两个随机整数bintegerlist,并考虑它们的长度为l的二进制表示形式,例如 a=10->1010b=6->0110。然后,我在两个二进制表示形式之间执行统一的转换,并将所得二进制数的整数值保存在integerlist中的随机位置。均匀重组意味着整数c的二进制表示形式的每个条目都是以相等的概率从ab的二进制表示形式条目中提取的,例如

a=10->1010
b=6 ->0110
      1110 ->c=14

为此,我想出了下面的代码,它不是很快。目前,我正在尝试获取该函数的数字版本,但到目前为止还没有成功。你能帮忙吗?

def recombination(integerlist, l):
    N = len(integerlist)
    for x1 in range(N):
        a = integerlist[random.randint(0, N-1)]
        b = integerlist[random.randint(0, N-1)]
        binary_a = list(map(int, numpy.binary_repr(a, width=l)))
        binary_b = list(map(int, numpy.binary_repr(b, width=l)))
        binary_c = [0]*l
        for x2 in range(l):
            if random.random() <= 0.5:
                binary_c[x2] = binary_a[x2]
            else:
                binary_c[x2] = binary_b[x2]
        c = 0
        for bit in binary_c:
            c = (c << 1) | bit
        integerlist[random.randint(0, N-1)] = c

编辑:如果我将list(map(int, numpy.binary_repr(a, width=l)))替换为以下功能

@nb.njit
def dec_to_binary_fct(a, l):
    bin_temp = []
    for i in range(l):
        i = l-i-1
        k = a >> i
        if (k & 1):
            bin_temp.append(1)
        else:
            bin_temp.append(0)
    return bin_temp

我可以将@nb.njit放在def recombination(integerlist, l):前面,这已经大大提高了性能。我仍然好奇是否可以提高性能。

1 个答案:

答案 0 :(得分:3)

这是一种计算交叉的方法,我敢肯定这是更快的方法:

def xover(a, b):
    l = max(a.bit_length(), b.bit_length())
    return a^((a^b)&random.randint(0, (1<<l)-1))

说明:

  • 我们首先使用按位互斥或查找不同的位(对于其他位,从哪里获取都无所谓,因此我们最好从a中获取所有这些位)
  • 然后我们使用按位和随机掩码将其平均删除一半
  • 最后使用按位异或或再次翻转a中的其余位(我们知道在这些位置上,翻转为b)