繁体   English   中英

有什么办法可以用更高效的python替换for循环

[英]Is there any way to replace a for loop with something more efficient in python

我下面的代码检查周围像素到python中我对象的像素。

self.surr = [None, None, None, None, None, None, None, None]

for i in range(9):
#for x in range(-1, 2):
    #for y in range(-1, 2):
        if i != 5:
            x = i % 3 - 2
            y = int((i % 3) / 3) - 1

        if x == 0 and y == 0:
            pass
        else:
            PAI = allPixels[(self.x + x) % width][(self.y + y) % height] if allPixels[(self.x + x) % width][(self.y + y) % height] != None else None

        self.surr[(y * 3) + x] = (PAI)

return self.surr

这将返回一个长度为8的列表,其中包含一个Pixel对象或None allPixels是一个2D数组,也可以保存一个Pixel对象或None 我尝试过然后注释掉嵌套循环,但是它们运行的​​速度比我当前使用的方法慢一点。 但是,这仍然太慢了,好像屏幕上有3000个像素,这是最后屏幕上总像素的下限,算一算,每一帧都有很多。

如何使用NumPy或其他方法使运行速度更快?

如果您想查看整个代码,可以在这里找到: https : //pastebin.com/EuutUVjS

感谢你给与我的帮助!

本质上,您正在做的事情需要循环-但是如果您可以将循环移动到numpy中,通常会快5到20倍。

对于您而言,您要尝试的是将每个像素与其相邻像素进行比较。 作为阵列范围的操作,您该怎么做? 简单:将数组与移了1的同一数组进行比较。

这是一个更简单的示例:

>>> a = np.array([1,2,4,8,16])
>>> for i in range(1, len(a)):
...     print(a[i] - a[i-1], end=' ')
1 2 4 8
>>> print(a[1:] - a[:-1])
[1 2 4 8]

因此,对于2D数组,它只是:

north = a[:-1]
ne = a[:-1,1:]
east = a[:,1:]
se = a[1:,1:]
south = a[1:]
sw = a[1:,:-1]
west = a[:,:-1]
nw = a[:-1,:-1]

请注意,这并没有浪费大量时间,也没有在内存中建立额外的8个数组。 它只是在同一内存上创建8个视图。

有关康威生活游戏模拟中使用这些移位阵列的示例,请参见compsci上的答案

如果要以不同的方式处理边界,则可能需要“零扩展”数组,但这是您可能会遇到的唯一复杂性。


但是,如果在其中存储Python对象,那么从numpy中获得多少收益是有限制的。 通常,您要存储数字数组。

我不知道您的Pixel对象中包含什么,但是我们假装它们只是颜色值,就像三个浮点数一样。 在这种情况下,您可以使用具有三个浮点数的结构化dtype的2D数组,也可以仅使用3D数组(逐列,逐个rgb),使用NaN值代替None

如果这样做,阵列范围的操作可以以接近机器的本机速度进行操作,包括使用SIMD操作进行数据并行化。 如果您不这样做,则仅以自然速度进行循环; 循环中的算法仍然和非Numpy Python一样慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM