簡體   English   中英

在python中迭代的最快方法

[英]fastest way to iterate in python

到目前為止,我從來沒有擔心過這個問題,但現在我需要使用一些需要由 PyOpenGL 緩沖的大量頂點,而且似乎 python 迭代是瓶頸。 這是情況。 我有一個 3D 點vertices數組,在每一步我都必須為每個頂點計算一個 4D 顏色數組。 到目前為止,我的方法是:

upper_border = len(self.vertices) / 3
#Only generate at first step, otherwise use old one and replace values
if self.color_array is None:
     self.color_array = numpy.empty(4 * upper_border)  

for i in range(upper_border):
     #Obtain a color between a start->end color
     diff_activity = (activity[i] - self.min) / abs_diff  
     clr_idx = i * 4
     self.color_array[clr_idx] = start_colors[0] + diff_activity * end_colors[0]
     self.color_array[clr_idx + 1] = start_colors[1] + diff_activity * end_colors[1]
     self.color_array[clr_idx + 2] = start_colors[2] + diff_activity * end_colors[2]
     self.color_array[clr_idx + 3] = 1

現在我不認為我可以做任何其他事情來消除循環每一步的操作,但我猜必須有一種更優化的性能方式來執行該循環。 我這么說是因為例如在 javascript 中,相同的微積分產生 9FPS 而在 Python 中我只得到 2-3 FPS。

問候, 博格丹

為了使此代碼更快,您需要對其進行“向量化”:使用 NumPy 的廣播規則,將所有顯式 Python 循環替換為隱式循環。 我可以嘗試給出循環的矢量化版本:

if self.color_array is None:
     self.color_array = numpy.empty((len(activity), 4))
diff_activity = (activity - self.min) / abs_diff
self.color_array[:, :3] = (start_colors + 
                           diff_activity[:, numpy.newaxis] + 
                           end_colors)
self.color_array[:, 3] = 1

請注意,我不得不做很多猜測,因為我不確定您的所有變量是什么以及代碼應該做什么,所以我不能保證這段代碼可以運行。 我把color_array變成了一個二維數組,因為這看起來更合適。 這可能需要更改代碼的其他部分(或者您需要再次展平數組)。

我假設self.minabs_diff是標量,所有其他名稱都引用以下形狀的 NumPy 數組:

activity.shape == (len(vertices) // 3,)
start_colors.shape == (3,)
end_colors.shape == (3,)

它也看起來好像vertices是一個一維數組,應該是一個二維數組。

  1. 首先:使用cProfile分析您的代碼
  2. 您應該使用xrange而不是 range
  3. 你應該避免在每個循環中調用self.color_array 4 次,嘗試在循環之前創建一個局部變量,並在循環中使用它: local_array = self.color_array
  4. 嘗試預先計算start_colors[N]end_colors[N]start_color_0 = start_colors[0]
  5. 嘗試使用list.extend()來減少循環中的行數:

     local_array.extend([ start_colors_0 + diff_activity * end_colors_0, start_colors_1 + diff_activity * end_colors_1, start_colors_2 + diff_activity * end_colors_2, 1 ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM