2010-06-22 343 views
-1

我準備了一個關於製作軟件應用程序的項目。它是完整的,工作正常,但執行速度非常慢..我已經採取了幾塊代碼,並優化它..如何提高性能?

我試過psyco ..即我安裝了psyco,並添加了兩行我的代碼

import psyco 
psyco.full() 

不知道這是否使用psyco ..如果這是錯誤的。請告訴我如何使用psyco ..因爲我加了這個,發現沒有任何改進..

我試過了剖析,我知道代碼行需要時間,但是這些不能進一步優化,並且是不可避免的代碼行。 。

我還以爲改寫「C」的代碼使用一些Python包的選項..但我一直在使用python的額外包,它不是基本的Python的一部分,一個非常糟糕的經歷..

我正在使用python 2.6和windows vista ..請告訴方法,以提高整個代碼的執行速度顯着..至少5倍..請..

我沒有寫我的方法的代碼,你中有間小方法..沒有主..

是儘可能少的建議我是一個IO約束問題..因爲我需要調用的代碼大約500次,這涉及打開和關閉每個電話至少2個文件。

在這裏,當打開一個.pm文件,它有兩列,我只需要第一列,所以我複製整個第一列放入列表中,並將它傳遞給函數以獲得其行號,然後打開其他文件以將該行號的元素放入列表中...

這是我想要的任務...我猜加載第一列的元素融入到列表費時任何想法來糾正這個..

我怎樣才能提高IO瓶頸約束

尋找幫助拼命

+0

你提到你知道哪些線路表現不佳。也許你可以發佈這些特定的行?我懷疑沒有一個能夠自動將每個程序的性能提高五倍的靈丹妙藥。 – Slartibartfast 2010-06-22 05:10:21

+0

您應該張貼一些代碼(例如性能瓶頸部分) – 2010-06-22 05:11:05

+1

同上所有。此外,請重新格式化問題,以便閱讀和理解。如果我能,但我不能。 – sdolan 2010-06-22 05:14:53

回答

3

如果您可以切換到二進制文件格式,您可以獲得更好的性能。大部分代碼都是在解析和字符串操作。你正在做很多將字符串轉換爲浮點數,這比你想象的要慢。

+0

請,把一些代碼,我更好的理解我得到你想說的,但作爲一個新手無法做鱈魚對於這些嘗試您的以上建議也,但它沒有太大的區別因爲我不知道如何使min func在單個列表掃描中做出兩個比較。因此,我讓它在一次調用中返回兩個列表,但在函數中只是重複相同的代碼兩次,因此它沒有做任何改進。只是給一些示例代碼。 – kaki 2010-06-22 06:44:30

0

Psyco是可以表現使用和導入一樣簡單,並調用psyco.full()。所以你對你的psyco用法是正確的。

如果你正在試圖建立使用C/C++一個Python模塊,看看的boost ::蟒蛇

你真的應該張貼您作進一步的分析代碼。

1

您不太可能通過調整代碼來看到5倍的性能差異。

首先,您應該考慮改進算法 - 您是否使用最佳數據結構進行工作?也許在正確的地方使用dictset可以加快代碼的速度。

編寫一個C模塊並不是那麼困難,而且如果您找不到改進Python代碼的方法,那麼這是另一種選擇。通常情況下,使用C代碼的速度通常會高出5倍。

也許你的問題是IO界限。然後你需要考慮如何提高IO的性能如果你想在這裏獲得更多的幫助,你可能需要展示一些代碼或至少描述你的程序的功能。

更新: 看起來像你打開和關閉大量的文件,往往是在窗戶上痛苦緩慢。

0

爲了優化您的代碼速度,您只需對其進行配置並查看問題出在哪裏。猜測並沒有幫助。但是,一旦你知道了在哪裏,你最想要得到的結果通常來自降序:改進算法,使用更合適的數據結構,消除資源瓶頸(IO,內存,CPU),減少內存分配,減少上下文切換子程序)。

+0

至於你的具體例子,可能有兩個角度。我會看你將數據存儲在文件中的方式,並且必須解析它們。這很可能是IO問題。另一個角度是你使用的split和line.partition方法。這些出奇的慢。 – 2010-06-22 05:37:13

+0

你能告訴我這些拆分和分區適合我的任務的任何替代方法嗎?我是一個新手,並不知道完整的功能 – kaki 2010-06-22 06:00:36

+0

對不起,真的不知道Python語法或庫 - 可怕的語言 - 但在Perl中,我使用substr調用取得了嚴重的性能提升。但我會按照dmazzoni所說的去做,切換到二進制格式,並避免所有這些字符串操作。 – 2010-06-22 23:55:43

0

下面是優化一個機會:你打電話get_list兩次,具有非常相似的論點:

join_cost_index_end[index] = get_list(file, float(abs1), fout) 
join_cost_index_strt[index] = get_list(file, float(abs2), fout) 

這意味着,大多數中get_list的工作被毫無理由地做兩次。重寫它,以便get_list被調用一次,並讓它同時返回index_end和index_strt。

+0

thnq會嘗試! – kaki 2010-06-22 06:25:47

+0

這將不會有任何區別,直到我改變獲取列表函數掃描通過列表只有一次...但我想min()我不能被manupalated,以便我可以比較在單個文件掃描和返回最小值的兩個變量..如果可能的話,請把一些代碼,以便我可以理解友好.. – kaki 2010-06-22 06:41:02

0

爲什麼bot只是嘗試使用cython?無需更改任何代碼,您應該可以獲得更好的性能。稍微修改一下,這應該會有更多幫助。

+0

是的,這是我所希望的,你可以更具體地說明如何使用和實施這些,什麼是小修改...而不是隻是回答這種模糊......如果你用過,請告訴我,如果有什麼需要被安裝或如何使用...thnq – kaki 2010-06-22 07:03:34

+1

我不是來做你的工作,我給了你一個提示,現在搜索cython並閱讀文檔。 Cython是不是很難承擔和使用... – 2010-06-22 11:40:23

+0

我沒有問你做我的工作...我只是要求建議.. 你怎麼能說只有很少的修改,並保留它..沒有提及什麼修改如果U知道他們是什麼...如果你不在這裏幫助其他爲什麼在這裏然後.. 不只是給這樣的答案,只是爲了增加你的聲譽,因爲... 只給出一個包中的幾千可用與給任何有關它的信息..如果每個建議一個包作爲答案...它會是什麼。 我不是在這裏進入一個詞戰爭。我們在這裏互相幫助。所以「和平」。在我給你答案之前提高你的代表分數「例如我在這裏工作fr u – kaki 2010-06-23 06:11:44