2016-04-06 56 views
0

我的程序與API交互,執行計算並使用信息構建Gui,其中一些存儲在本地文件中(以保存信息在登錄之間)。當使用CPROFILE剖析我的代碼,我得到以下的輸出:我認爲我的程序受到文件I/O的瓶頸,我需要更好的解決方案

C:\Users\cheek\Documents\Code\LoL-Performance-Tracker>python -m cProfile -s tottime LoL-Performance-Tracker.py 
LoL-Performance-Tracker.py:271: SyntaxWarning: name 'apiKey' is used prior to global declaration 
    global apiKey 
Entered buildMatchHistory 
     262880 function calls (261634 primitive calls) in 11.867 seconds 

    Ordered by: internal time 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     161 8.684 0.054 8.684 0.054 decoder.py:370(raw_decode) 
     1 1.100 1.100 1.100 1.100 {question} 
     1 0.694 0.694 1.794 1.794 {built-in method exec_} 
     1 0.506 0.506 9.848 9.848 LoL-Performance-Tracker.py:88(buildMatchHistory) 
     168 0.361 0.002 0.361 0.002 {method 'read' of 'file' objects} 
     84 0.073 0.001 0.149 0.002 ConfigParser.py:464(_read) 
     1 0.040 0.040 11.867 11.867 LoL-Performance-Tracker.py:7(<module>) 
     80 0.035 0.000 9.323 0.117 MatchHistoryBuilder.py:37(buildMatch) 
     161 0.026 0.000 9.074 0.056 __init__.py:258(load) 
     251 0.025 0.000 0.025 0.000 {open} 
     1 0.023 0.023 0.023 0.023 {built-in method show} 
    23338 0.019 0.000 0.019 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 
    23176 0.017 0.000 0.017 0.000 collections.py:59(__setitem__) 
     2 0.016 0.008 0.016 0.008 {built-in method setWidget} 
     84 0.010 0.000 0.010 0.000 {built-in method setStyleSheet} 
    11844 0.008 0.000 0.008 0.000 {method 'readline' of 'file' objects} 
     1 0.006 0.006 11.704 11.704 LoL-Performance-Tracker.py:326(main) 

... 

的buildMatchHistory方法是什麼,我以爲會是問題,因爲它建立GUI對象,通常是相當繁瑣,但它似乎沒有成爲。

我正在使用json編碼器/解碼器來執行具有大量信息的文件I/O。我不認爲需要幾秒鐘才能完成這些操作,但看起來像是這樣。我的理解是否正確嗎?如果不是,我應該在哪裏看?

如果我是對的,在登錄之間提取和存儲信息的更好方案是什麼?

+0

您正在正確解釋結果。您存儲了多少個文件?如果目標信息分佈在多個文件中,則可能會通過使用多處理來並行讀取來看到速度的增加。 – skrrgwasme

+0

分析器輸出將與代碼更加有幫助。 –

+0

我應該只是發佈代碼或添加一個鏈接到一個pastebin或? –

回答

1

嘗試使用性能監視器

CPROFILE看起來真的很酷,但你有沒有使用性能監視器?如果您正在運行Windows,它將附帶一個名爲「Perfmon」的應用程序。如果你拉起這個應用程序,你可以通過使用性能計數器來監視幾乎任何性能問題(PF不重要)。 這真的可以幫助你找到你的瓶頸。我會告訴你如何做磁盤使用。這是它是如何工作的...

打開應用程序,然後左鍵單擊監視工具文件夾下的「性能監視器」。右鍵單擊圖形並單擊「添加計數器...」。你會看到一個窗口。

enter image description here

如果您導航到物理磁盤,你可以添加磁盤讀取和磁盤寫入百分比的計數器。一旦添加這些計數器,您就可以在圖表上監控您的磁盤使用情況。

注意:您可以將此策略應用於您遇到的任何性能問題!

解決您的問題

如果你的磁盤佔用率很低,那麼I/O可能不是一個問題。

您的cProfile似乎認爲「解碼器」對「tottime」有很大貢獻。嘗試檢查處理器,看它是否以100%運行。如果是這樣,也許你可以簡化解碼器,或將這些計算卸載到GPU上。

如果您的磁盤通過USB連接,則還可以監視USB性能。

我在您的帖子中看到「登錄」。也許有東西打電話給在線資源。嘗試監視網絡。

也許你沒有足夠的RAM,請檢查它。

如果一切都失敗,您可以使用此方法逐步消除可能的瓶頸。祝你好運,找到自己的瓶頸,期待看到其他人的想法。

+0

謝謝,這很有幫助。我檢查了我的讀/寫%s,但都沒有超過10%,而且大都非常小。我不認爲這表明了閱讀和寫作的困擾。鑑於此,有什麼更好的方式來存儲信息,以便我不必在代碼中執行161次這樣的操作? –

相關問題