2016-03-04 47 views
1

我相當喜歡開發一個Kivy應用程序。它的目標是android,但也可以在桌面上運行(同時使用不同的皮膚),最終還會有iOs。安卓(kivy)上的Python - 某些操作的速度瓶頸?

我大量使用基本依賴關係: -

  • 扭曲 - 用這個作爲一個IPC,我的應用程序有一個服務器/客戶端的數據操作和UI之間 關係

  • 嗖 - 文本搜索

  • xmltodict - 輕鬆處理XML

我真的很長時間在Android上的應用程序啓動時間,在一個相對最近的電話,這並不是一個好兆頭。從我粗略計時(基於了time.time()和我的應用程序的初始化時間減去): - 在

  • 我的初始化

    • 我的應用從kivy啓動獲得控制在約1秒自定義類等,在2.4秒標記

    • 在14.4秒標記完成後,我終於完成了我的批量數據加載

    • 的在17號的Econd標誌,我開始使用雙絞線

    • 在22秒大關發送數據到客戶端UI,用戶界面接收數據

    有多個點我想,以解決那裏。例如,數據發送的大約5秒差距可以很容易地分解成碎片並在零碎的UI中更新,所以我稍後保留,但我需要詢問數據加載的長達12秒的差距。該數據加載涉及創建有關的自定義類的1000個實例,下面的步驟(累計時間超過1000個實例): - 從1000文本XML文件

    • 讀取數據(0.734秒)

    • 解析在讀取數據的XML(9.198秒)

    • 填充對象的變量基於解析XML(0.585秒)

    • 目錄樹遍歷(使用此定位一定的基本文件夾,0.0824秒)

    • 修改時間測量爲XML文件(0.12秒),

    測得定時讓我驚訝,因爲在我的筆記本電腦上運行的相同的代碼的等效定時是0.041 ,0.9,0.062,0.009和0.016)。一切都慢了10倍。

    什麼,如果有的話,我能做些什麼呢?用於測試的手機具有3GB的RAM和Snapdragon 801處理器,所以我很擔心在較慢/較舊的型號上使用此應用程序。我最初的想法是,減速是由於SD卡本身比筆記本電腦的硬盤驅動器慢,但事實上,XML解析(非IO相關)花了這麼長時間似乎表明處理問題。

    建議/批評歡迎。

  • +0

    你可以存儲的數據比xml更方便嗎?如何泡菜甚至JSON? – Muposat

    +0

    我已經考慮過了,但我的基礎數據源需要xml,因爲遺留原因。我目前正在思考一個在啓動時使用的緩存(可能是pickled),一旦數據讀取線程發現有所不同,它就會得到更新。這只是推遲了這個問題,雖然...... –

    +0

    看看你是否可以得到lxml庫,它被編譯並且應該更快。我肯定會把所有我能做的事情都緩存下來,即使這隻會縮短啓動時間。 – Muposat

    回答

    1

    直接的可能性是,你只看到android處理器比桌面處理器慢。我不確定現在的基準比較是什麼,但過去我已經看到這是一個問題。也就是說,我猜你也一樣,差別不應該那麼大。

    我不知道它是否會有所作爲,但一個普遍的嘗試可能是編譯armeabi-v7a(而不是默認的armeabi)。這使得硬件浮點計算成爲可能。我不知道它在通用應用程序中是否有所作爲,但它肯定可以。您可以在buildozer master分支中使用具有--arch=armeabi-v7aandroid_new目標的python-for-android master分支(其餘的buildozer操作相同,並且它自動使用v7a)將其作爲目標。

    另一個問題是,您是否有權訪問更高效的xml解析器?如果你可以在例如cython而不是python(我不知道你現在在用什麼),這可能會有所作爲。我發現使用更高效的數據結構的另一種選擇已經在評論中提出。

    對不起,這些建議都非常具體。如果您在kivy支持渠道上詢問,您可能會找到找到並解決類似問題的人。

    +0

    謝謝,我會嘗試編譯選項。我的問題指定我使用xmltodict,並改變這將是一個相當複雜的任務。由於工作量的原因,最後的手段涉及。 –

    +0

    我已經使用lxml(應該儘可能快)進行黑客入侵,並且我大概需要5秒才能閱讀,分析和創建對象。哪一個更好,但仍比筆記本電腦慢10倍以上(速度提升相似)。 –

    +0

    就我可以用簡單的基準測試而言,編譯選項可以忽略不計的結果。 –