我需要快速实现以下问题,最好将其作为numba函数。我从名为a
的列表中选取两个随机整数b
和integerlist
,并考虑它们的长度为l
的二进制表示形式,例如
a=10->1010
,b=6->0110
。然后,我在两个二进制表示形式之间执行统一的转换,并将所得二进制数的整数值保存在integerlist
中的随机位置。均匀重组意味着整数c
的二进制表示形式的每个条目都是以相等的概率从a
或b
的二进制表示形式条目中提取的,例如
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):
前面,这已经大大提高了性能。我仍然好奇是否可以提高性能。
答案 0 :(得分:3)
这是一种计算交叉的方法,我敢肯定这是更快的方法:
def xover(a, b):
l = max(a.bit_length(), b.bit_length())
return a^((a^b)&random.randint(0, (1<<l)-1))
说明: