簡體   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