2015-02-06 76 views
0

我有這樣的代碼爲神經網絡庫我建立迭代Cython中的對象列表/集合的最快方法?

for connection in self.backwardConnections: 
    self._z += connection.value() 

其中connectioncdef class ConnectionbackwardConnections是連接蟒蛇list

我有兩個問題

  1. 什麼是通過Python列表最快的迭代? (我本來也可以用for int i in range (len (..))來完成)
  2. 如果我放棄Python列表方法,什麼樣的集合類型(例如numpy數組,C++向量等)可以容納我的Connection對象並提高性能?
+0

你在用這個值列表做更多的數學嗎?如果是這樣,你可以製作一個「numpy」數組,並對其進行操作。例如'values.sum()'。 'numpy'還有一個快速的'nditer'迭代器,可以在'cython中工作。 – hpaulj 2015-02-08 20:50:48

+0

@hpaulj事情是'connection.value()'被定義爲'self.weight * self.source.y',其中'source'是'Neuron','Y'和'weight'是'double's。我基本上建立了一個使用神經元作爲節點和連接作爲頂點的網絡圖。在我能做的事情上,有2個cpp向量指向'w'和'y',它們可以以c速度迭代。 – 2015-02-09 18:57:58

回答

0

for ... in ...:構造是迭代Python中列表的最快方式。切換到其他數據類型也不會顯着提高性能。這兩件事情已經很快了。

我的猜測是你要錯誤地優化這段代碼。爲什麼不考慮循環機制(可能佔用你運行時間的一小部分),爲什麼不考慮優化.value()所做的任何調用?

還有一種可能性,那就是Python對於你所要做的事情太慢了。不過,我發現這種情況非常罕見。

+0

'.value()'實際上是非常高效的。但是請等一下,你知道我在Cython上做這個嗎? (與C)。 – 2015-02-06 11:58:55