Python 基于给定概率高效地变异二进制字符串中的字符
我试图根据随机数概率有效地改变二进制字符串中的值。下面是我生成的一段代码,它是有效的,但我相信在处理数千个二进制字符串时,可以更好地减少时间和内存使用Python 基于给定概率高效地变异二进制字符串中的字符,python,genetic-algorithm,Python,Genetic Algorithm,我试图根据随机数概率有效地改变二进制字符串中的值。下面是我生成的一段代码,它是有效的,但我相信在处理数千个二进制字符串时,可以更好地减少时间和内存使用 b = '111111' c = [random.random() for x in range(len(b))] for x in range(len(b)): z = list(b) if c[x] <= 0.3: print(x, True) z[x] = '0' b
b = '111111'
c = [random.random() for x in range(len(b))]
for x in range(len(b)):
z = list(b)
if c[x] <= 0.3:
print(x, True)
z[x] = '0'
b = ''.join(z)
else:
print(x, False)
b='111111'
c=[random.random()表示范围内的x(len(b))]
对于范围(len(b))内的x:
z=列表(b)
如果c[x]您只需要一个列表理解就可以被join
方法使用
b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])
您只需要一个列表理解就可以被join
方法使用
b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])
完整的数学解决方案仅使用位(和log2
来计算b
或更好的“位数”,如注释中所示,bit\u length
)。这不涉及字符串(除了开始时的解析和最后的打印)
完整的数学解决方案仅使用位(和log2
来计算b
或更好的“位数”,如注释中所示,bit\u length
)。这不涉及字符串(除了开始时的解析和最后的打印)
直接使用整数Jean-Francois Fabre:在我正在构建的模型中,直接使用整数的问题是,从整数到二进制的转换器会生成字符串,反之则需要字符串。除此之外,还有很多二进制连接不能很好地处理整数。然后解析string=>int,生成并转换回stringwork直接处理整数Jean Francois Fabre:在我构建的模型中,直接处理整数的问题是,从整数到二进制的转换器会生成字符串,反过来需要字符串。除此之外,还有很多二进制连接不能很好地处理整数。然后解析string=>int,生成并转换回string,在这里也可以使用列表理解,这将是更快的选择:如果随机数低于某个值,则想法是将0
变为1
,或将1
变为0
。列表理解在这种情况下仍然有效吗?你不能改变字符串;您所能做的就是基于原始字符串的元素创建一个新字符串。在这里,您可以使用列表理解,它将更快:如果随机数低于某个值,则可以将0
变为1
,或将1
变为0
。列表理解在这种情况下仍然有效吗?你不能改变字符串;您所能做的就是基于原始字符串的元素创建一个新字符串。您可以使用b.bit\u length()
而不是log2。今天我学习了bit\u length()
wow。。。此外,这比“紧凑,所以显然更好”的公认答案更具可读性+1谢谢。根本不使用字符串更重要的是性能问题。我知道很多,所有语言中的字符串都不是我喜欢使用的东西,在Python中它们是对象,所以唯一能让另一个答案不那么慢的可能是(我不太了解缓存本身,但Python肯定会缓存对象)Python解释器使用的字符串值缓冲区和字符串对象缓存。此外,我只是不喜欢OneLiner,因为它们看起来很糟糕,几乎没有解释任何事情,但没关系,至少询问者会印象深刻,复制粘贴很有效……我不同意列表理解不好。一般来说没问题,在这种情况下,简短到可以理解。但你不能一点一点地理解列表。这就是我没有创建它的原因之一。你可以用b.bit\u length()
代替log2。今天我学习了bit\u length()
wow。。。此外,这比“紧凑,所以显然更好”的公认答案更具可读性+1谢谢。根本不使用字符串更重要的是性能问题。我知道很多,所有语言中的字符串都不是我喜欢使用的东西,在Python中它们是对象,所以唯一能让另一个答案不那么慢的可能是(我不太了解缓存本身,但Python肯定会缓存对象)Python解释器使用的字符串值缓冲区和字符串对象缓存。此外,我只是不喜欢OneLiner,因为它们看起来很糟糕,几乎没有解释任何事情,但没关系,至少询问者会印象深刻,复制粘贴很有效……我不同意列表理解不好。一般来说没问题,在这种情况下,简短到可以理解。但你不能一点一点地理解列表。这就是我没有创建一个的原因之一。
>>> bin(new_b)
'0b11101'