我的代码使用三个随机数和一些if语句随机移动一个像素。使用cProfiler,结果证明该函数效率很低。
blist
希望这是非常自我解释但我可以根据需要提供上下文。 如何更快或更有效地制作这些if else语句?
如果需要,可以找到完整的代码here。
答案 0 :(得分:1)
如果您认为与像素移动方法不同,可以使用不同的方法。由于在二维像素阵列中最多有八个可能的相邻像素移动,因此您可以定义一个常数list
个移动,并将它们与一个索引配对,该索引指的是由所述移动产生的像素。
根据我对您的代码的解释,您可以在__init__
类的pixel
方法中定义此内容。
设置:
changes_1d = (-1, 0, 1)
changes_2d = [(i,j) for j in changes_1d for i in changes_1d if i or j]
self.movements = tuple(enumerate(changes_2d)) # Assign pixel index to each movement
self.movements
的内容:
0 (-1, -1)
1 (0, -1)
2 (1, -1)
3 (-1, 0)
4 (1, 0)
5 (-1, 1)
6 (0, 1)
7 (1, 1)
为什么设置它?现在我们可以使用random.choice()
来快速选择随机2-D像素移动,我们可以通过使用与(dx,dy)移动对一起返回的索引来检查此移动是否有效:
def move(self):
s = self.surrounding()
surroundingBool = [i is not None for i in s]
pixel, movement = random.choice(self.movements)
if surroundingBool[pixel]:
self.x += movement[0]
self.y += movement[1]
注意:这假设移动到八个周围像素中的任何一个的概率相等。
但是,我认为self.surrounding()
函数可能存在很大的低效率,特别是在这一行中:
PAI = allPixels[(self.x + x) % width][(self.y + y) % height] if allPixels[(self.x + x) % width][(self.y + y) % height] != None else None
您正在检查像素是否为None,然后将其分配给PAI
。虽然如果为“无”,则将“无”分配给PAI
,使if else
检查变为冗余。以下陈述是等效的:
PAI = allPixels[(self.x + x) % width][(self.y + y) % height]
我会提供更多建议,但有很多代码可供理解。继续寻找改进方法!