两个整数的二进制表示的一致复合

2024-09-30 01:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个快速实现以下问题,最好作为一个numba函数。我从一个名为integerlist的列表中取两个随机整数a&;b,然后考虑它们的长度的二进制表示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):前面,这已经大大提高了性能。我仍然很好奇能否提高表演水平。你知道吗


Tags: inmapforbindef二进制range整数
1条回答
网友
1楼 · 发布于 2024-09-30 01:29:37

下面是一种计算交叉点的方法,我敢肯定它会更快:

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

说明:

  • 我们首先使用按位异或来查找不同的位(对于其他位,我们从何处获取它们并不重要,因此我们不妨从a中获取所有这些位)
  • 然后我们使用按位and和随机掩码平均删除其中的一半
  • 最后再次使用位异或来翻转a中的剩余位(我们知道在这些位置翻转的a就是b)

相关问题 更多 >

    热门问题