使随机像素移动更有效地运行

时间:2018-05-20 21:39:16

标签: python performance pygame

我的代码使用三个随机数和一些if语句随机移动一个像素。使用cProfiler,结果证明该函数效率很低。

blist

希望这是非常自我解释但我可以根据需要提供上下文。 如何更快或更有效地制作这些if else语句?

如果需要,可以找到完整的代码here

1 个答案:

答案 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]

我会提供更多建议,但有很多代码可供理解。继续寻找改进方法!