2010-03-30 68 views
10

最近,我爲Python/Django開發了一個計費應用程序。幾個月來一切都很好,但現在我正在觀察,由於越來越多的用戶使用該應用程序,性能下降。現在的問題是,應用程序現在對財務團隊非常關鍵。現在財務團隊在我的生活中解決了性能問題。我沒有其他選擇,只能找到一種方法來提高計費應用程序的性能。Python中的優化技術

所以請你們知道在python任何性能優化技術,這將真正幫助我的可擴展性問題

夥計們,我們正在使用MySQL數據庫及其託管在Linux機器上的Apache Web服務器上。其次,我注意到更多的是所有的應用程序都很慢,而不是數據庫事務部分。例如,一旦應用程序被加載,然後它可以正常工作,但是如果他們導航到該應用程序的其他鏈接,則需要很長時間。

而且是我在評論說,我們使用HTML,CSS和Javascript

+3

給你任何TECHNIC之前,我們必須知道什麼是您的應用程序的瓶頸。 – 2010-03-30 14:10:16

+2

你的架構的其餘部分是什麼? mod_wsgi的?蟒蛇? MySQL的? SQLite的? – 2010-03-30 15:22:02

+0

你的架構的其餘部分是什麼? mod_wsgi的? mod_python的?你的靜態內容如何提供?有多少個Python進程連接到Apache? – 2010-03-30 18:48:44

回答

4

Python中的一種驚奇的是,Python的代碼是相當有效的。所以一些常規提示:

  • 使用內置插件和標準功能只要有可能,他們已經相當不錯了優化。
  • 嘗試使用延遲生成器代替一次性臨時列表。
  • 使用numpy進行向量運算。
  • 如果在x86 32位上運行,請使用psyco。
  • 用低級語言編寫性能關鍵循環(C,Pyrex,Cython等)。
  • 當調用對象集合的同一方法時,獲取對類函數的引用並使用它,它將在對象字典中保存查找(這是一個微型優化,不確定它是否值得)

當然,如果可擴展性是最重要的:

  • 使用O(n)(或更好)的算法!否則,您的系統無法線性擴展。
  • 編寫多處理器感知代碼。在某些時候,你需要投入更多的計算能力,並且你的軟件必須準備好使用它!
+0

最後一個是一般情況下的一個優點,但不幸的是,你不能在python中編寫多處理器感知代碼,因爲它的內部結構。這也是防止Python成爲我的首選語言:( – Dacav 2010-03-30 16:55:42

+1

@Dacav - 你當然可以用Python和幾乎任何語言編寫多處理器感知代碼。在Python中比在GIL中需要更多的尷尬,但是如果你停止思考線程和共享內存,而是想到進程和消息傳遞,你的問題會大大減少。 – Kylotan 2010-03-31 10:56:52

+1

就是這樣,一個Python實例不能以真正的並行性運行線程,但是你可以有不同的進程協作。把PP(http://www.parallelpython.com/)這個工作放在一邊,再加上你對MPI和CORBA也有綁定 – fortran 2010-03-31 11:18:42

11

,你必須通過尋找你的代碼的一部分是緩慢的開始。

沒有人可以幫助你沒有這些信息。

您可以使用Python profilers來分析您的代碼,然後返回給我們並輸出結果。

如果它是一個Web應用程序,第一個嫌疑犯通常是數據庫。如果這是一個密集型的圖形用戶界面應用程序,那麼先看一下算法算法。

但請記住,perf的問題非常不直觀,因此客觀的評估是唯一的選擇。

+1

沒錯,只有一個警告。你說「找出你的代碼的哪一部分很慢」。沒有什麼可以表明的,但是,他的代碼很慢。我們只知道* system *很慢。如果你是在32MB內存和100K用戶的計算機上運行一個Python web應用程序,那麼你可以「優化」你的Python代碼,直到你臉色發青,但系統仍然很慢。 – Ken 2010-03-30 16:54:26

+1

大聲笑。如此真實。它記得這個花了六個月時間的人,所以他的程序將只消耗256個RAM。他自豪地向管理層介紹了這種改進:「你爲什麼不買1G RAM?」 – 2010-03-30 18:56:03

+2

我走進了5個DBA辯論方式的會議,以在數據倉庫項目中節省100Gb。我說我們都可以壓低Apple Store併購買1Tb的磁盤,而不用花費這個會議花費公司的錢。在錯誤的地方度過的強烈的努力是浪費時間。 – 2010-03-30 19:58:49

6

好的,並非完全符合要求,但在您開始修復之前,請確保每個人都瞭解情況。在我看來,他們正在給你施加一些壓力來解決這個「問題」。首先,當你編寫應用程序時,他們是否指定了性能要求?他們是否告訴你他們需要X操作才能完成不到Y秒?他們是否指定了必須支持多少個併發用戶而不損害性能?如果沒有,那麼告訴他們退後一步,它是部署的迭代(階段,階段,任何),主要目標是功能和測試。第二階段是性能改進。讓他們(在你的幫助下)明確地提出一些對系統性能的非功能要求。 a)你將消除財務團隊施加的壓力(我知道他們可能是一個真正的痛苦)b)你和你的客戶都會清楚地知道什麼是什麼你的意思是「表現」c)你將有一個基礎,你可以衡量你的進步,最重要的是d)你將有一些商定的時間來執行/修復性能問題。

PS。除此之外,請查看索引... :)

+1

+1您應該詢問您的用戶他們希望您改進的內容。另外,你必須讓他們明白,表演是一個必須被視爲特徵的特徵。 – 2010-03-30 14:38:50

0

對於您所描述的應用程序類型(Web應用程序可能由數據庫支持),您的性能問題是不可能是語言特定的。他們更有可能從設計或架構問題中獲得,儘管它們也可能是簡單的編碼問題。

要對此進行分類,您需要弄清楚應用程序中的瓶頸位置,並且需要某種profiler

一旦你找到了瓶頸,你將處於一個更好的位置。您可以評估,然後問題領域的共同問題,包括:

任何解決方案的具體細節將取決於您找到的瓶頸的細節。

2

之前,你可以「修復」你需要知道什麼是「破」的東西。在軟件開發中,這意味着分析,剖析,剖析。我提到了分析嗎?不分析你不知道CPU週期和掛鐘時間在哪裏。就像其他人所說的那樣,您需要發佈更多有用的信息來發布整個堆棧的詳細信息。 Python版本,你用什麼來存儲數據(mysql,postgres,平面文件等),什麼web服務器接口cgi,fcgi,wsgi,乘客等等你如何生成HTML,CSS和假設Javascript。然後你可以得到更多具體的答案。

1

您可能會對我在前段時間找到的this document感興趣。 作爲個人的建議,儘可能pythonic:懶惰評估是關鍵字,所以學會使用迭代器和發電機。

0

這裏有一些很棒的建議......所以讓我建議一個實現細節。我發現django-command-extensions中的runprofileserver命令非常方便用於分析我的Django代碼。

0

我不知道這是否會解決這個問題,但你應該看看psyco