2016-05-13 55 views
1

我做了一個Python模塊(swood),直到最近,它是一個包含許多類的大文件。將相關類重構爲單獨的文件後,所有內容仍然有效,儘管速度降低了大約50%。我認爲,如果有的話,它會快一點,因爲Python可以更有效地緩存每個文件的字節碼,從而縮短啓動時間。爲什麼將我的模塊分成多個文件會讓它變慢?

我正在使用CPython運行此代碼(尚未用PyPy等測試)。我在舊版本和重構版本上運行line_profiler,並且在重構之前和之後花在每行上的處理時間百分比大致相同。

這裏有一些關於我的計劃一些事情,可能有一些用它做:

  • 這讓很多小班像Note和實例,這些可能是昂貴的,雖然這不是之前的問題重構。
  • 製作這些類時,它從一個單獨的文件中獲取它,它在開頭處就是import
  • 有在需要最長的部分(scalingmixing音頻)
  • 發生了很多numpy基於陣列操縱我有我的筆記縮放存儲,如果他們在使用三次以上的高速緩存7.5秒。 (code

什麼導致我的代碼在沒有做任何事情之後變慢,而是將它分離成多個文件?

+1

你可能在某個時候搞砸。將你的代碼分成更多的模塊會導致它加載所有模塊需要一些時間,但是這種下降會比你報告的要低得多。沒有任何東西突然跳出來,顯得很慢,但我確實看到了一些奇怪的東西(比如'__hash__'沒有'__eq__'),表明你的代碼可能不是沒有bug的。 – user2357112

回答

2

經過多次基準測試後,我懷疑是其中一件事:不得不從另一個模塊訪問函數/類意味着Python解釋器的另一個查找,並且在一些緊密循環中添加了輕微的減速。 The Python wiki has something about this, too:

避免點...

假設你不能使用地圖或列表理解?您可能會被for循環卡住 。 for循環示例有另一個低效率。 newlist.append和word.upper都是 每次通過循環重新評估的函數引用。原本的環可以 替換爲:

upper = str.upper 
newlist = [] 
append = newlist.append 
for word in oldlist: 
    append(upper(word)) 
2

您的重構似乎做了很多事情,而不僅僅是將類移入不同的文件。例如,UncachedWavFile丟失了一個__setitem__方法。而在其他地方,幻數已經改變了。我建議你先找別的地方慢下來。

我不希望看到重構代碼庫到單獨文件的速度有任何不同,預計啓動時間可能會縮短(甚至微乎其微)。我建議在分割之前進行分支,並且只將代碼分離爲單獨的文件,分析代碼的性能,然後慢慢添加自從分割和分析以來每次添加的代碼,以查看代碼變慢的原因。

相關問題