[英]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.