2011-12-13 90 views
12

當我開始學習Python時,我創建了幾個沒有類(僅函數)的應用程序,現在我知道類,並知道當我用類重寫代碼時,代碼會非常易讀(並且易於理解)。Python代碼的類更慢嗎?

當我將一般使用類時代碼會慢很多嗎?

+0

這可能要取決於你如何實現它以及你的函數做什麼。您可以使用計時模塊自己做一些測試。 –

+0

這個問題遠遠沒有普遍得到有意義的回答。從用例到用例,這會有很大的不同。只需嘗試一下並衡量。還要確保性能實際上是一個問題。 –

+3

如果使用類的性能受到影響(如果有的話)對您有任何意義,那麼您可能不應該首先使用python。不要擔心這麼小的細節。在99%的案例中,代碼可讀性是一個比性能更重要的因素。 – soulcheck

回答

19

號一般來說,你不會注意到基於使用類或沒有任何性能上的差異。隱含的不同代碼結構可能意味着其中一個比另一個更快,但不可能說哪個。

總是編寫代碼來讀取,然後如果,並且只有在速度不夠快時纔會更快。請記住:Premature optimization is the root of all evil

+5

爲惡根+1 – user3085931

+2

-1因爲有一定的號碼可以,可讀性比小性能差異更重要,但是在CPython中調用一個方法顯然比調用全局函數要慢,同創建一個對象比慢創建一張地圖。差異非常小,但班級仍然比無類別課程慢。 – Dakkaron

+1

@Dakkaron,我想你可能是對的。在發現使用類作爲本地列表數據結構的包裝的相同確切函數的速度是原來的兩倍速度之後,我剛剛發佈了此消息:http://stackoverflow.com/questions/41781048/overhead-of-creating-classes-in -python-exact-same-code-using-class-twice-as-slo –

5

你可能並不在乎你想象的那麼多。

真的。

當然,類的代碼可能會間接慢一點。也許。這是JIT編譯的目的,對嗎?我永遠不會記得哪些版本的python做這個,哪些不做,因爲:

性能並不重要。

至少像這樣有恆定的性能差異。除非你做了很多計算(你不是!),否則你會花更多的時間來開發/調試/維護你的代碼。爲此進行優化。

真的。因爲你永遠無法衡量這種差異,除非你處於緊張的環境中。不管怎樣,你不想在python中這樣做,除非你真的不關心時間。這不像你想在Python中平衡你的segway,對吧?你只是想計算一些數字,對吧?你的電腦真的很擅長這個。相信它。

這就是說,這並不意味着類是要走的路。只是速度不是你應該問的問題。相反,試着找出什麼樣的表示方式最適合你的代碼。看來,現在你知道類,你會以OO的方式編寫乾淨的代碼。前進。學習。迭代。

+7

「這不像你想要在Python中平衡你的segway,對吧?」其實... http://www.tlb.org/#scooter –

19

要回答這個問題:是的,它可能會慢一點,其他的都是平等的。過去變量(包括函數)的某些內容現在將成爲對象屬性,並且self.foo始終會比foo稍慢,無論foo最初是全局還是本地。 (局部變量可以通過索引來訪問,也可以通過名稱來訪問全局變量,但是對象的屬性查找可以是本地查詢或全局查找,加上可以在多個位置按屬性的名稱進行附加查找。)調用方法比調用一個函數稍微慢一點 - 不僅獲取屬性比較慢,而且進行調用也比較慢,因爲方法是一個包裝對象,它調用了你寫的函數,增加了額外的函數調用開銷。

這是顯而易見的嗎?通常不會。在極少數情況下,例如,如果您正在特定方法中訪問對象屬性(數千次或數百萬次),則可能會出現這種情況。但是在這種情況下,您可以將self.foo分配給方法頂部的局部變量foo,並在本地名稱中始終引用它,以重新獲得本地變量99.44%的性能優勢。

簡而言之:會出現可能性較小的性能問題,並且性能問題不僅僅是輕微問題,而是易於緩解。另一方面,假設你的問題適用於面向對象的解決方案,你可以節省小時的書面和維護代碼。節省時間可能就是爲什麼你要使用像Python這樣的語言開始。

5

Donald Knuth是計算的偉大老思想之一,他認爲「我們應該忘記小效率,大約97%的時間:過早優化是萬惡之源。」決定在速度增益的基礎上使用程序技術而不是面嚮對象的技術無論如何不可能實現,這不是一個明智的策略。

如果您的代碼正常工作並且無需修改,請隨時保持獨立。如果需要修改,那麼你應該考慮一個明智的重構來包含類,因爲在開發過程中,程序的可讀性比速度重要得多。您還將看到改進可維護性的好處。來自Kernighan和Plauger的「編程風格元素」的舊鋸仍然適用:

首先,讓它工作。然後(如果它不夠快),使其工作更快。

但是,首先要考慮到可讀性。認真。