首頁 >後端開發 >Python教學 >Python利用ctypes提高執行速度

Python利用ctypes提高執行速度

大家讲道理
大家讲道理原創
2016-11-10 15:06:141611瀏覽

ctypes 函式庫可以讓開發者藉助C語言進行開發。這個引入C語言的介面可以幫助我們做很多事情,例如需要呼叫C程式碼的來提高性能的一些小型問題。透過它你可以存取Windows系統上的 kernel32.dll 和 msvcrt.dll 動態連結函式庫,以及Linux系統上的 libc.so.6 函式庫。當然你也可以用自己的編譯好的共享函式庫

我們先來看一個簡單的例子 我們使用 Python 求 1000000 以內素數,重複這個過程10次,併計算運行時間。

Supplier和Memoize

SQLite是Android裡常用的資料儲存方式,存取資料庫資料時需要透過SQLiteOpenHelper。

一份好的資料庫連線程式碼應該能解決以下幾個問題: a) 建置實例比較費資源 b) 資料庫連線最好能重複使用 c) onUpdate等方法在執行時不能和其他執行個體構成衝突。

這裡可以很簡單的這樣寫

Suppliers.memoize(new Supplier() { @Override public SQLiteOpenHelper get() { return new ...;
  }
})

這段程式碼利用了Guava提供的一些輔助方法實作Supplier和Memoize和邏輯。顧名思義,Supplier一般被用作factory,generator,builder,closure。 Memoize類似於快取這種概念,它一旦產生了一個實例,在以後的呼叫中都會傳回同一實例,而且,執行緒安全。

這樣寫有幾個好處,一是需要時才去構建實例,並不會在一開始就去阻塞程序的執行,二是它很簡單的用memoize實現了緩存,保證只有一個實例生成。

程式碼注入

Glow是程式碼注入的重度使用者,它使我們的程式碼更加結構化,清晰,簡單,同時也節省了不少的開發時間。

Dagger 2是我們實現注入的刀具,有興趣的同學應該去網站多了解一下相關的內容。除了注入,它還有一些附贈功能,而這些恰巧能被我們用來實現緩存,而且還很簡單,我們只需要額外用到幾個annotation或接口而已。

@Singleton

相信大家對這個應該比較熟悉,這可是面試時的常問問題。簡單來說,它就是單例。因為所以,用了它你不用再擔心對這些實例怎麼實現快取了吧。

@Singleton public class SingletonClass {  
}

@Reusable

這是一個新的很酷的功能。單例雖然很好,但有些時候實例可能有些太大,一直放在內存,又不能回收,暫時可能程式也用不到,怎麼都感覺有些浪費。很多情況下,我們並沒有那麼嚴格的要求需要唯一的一個實例,能重用就重用,[email protected]�景,假如已有一個生成的實例,重用它就行,不行重新實例化,不需要保證。

@Reusable public class ReusableClass {  
}

Lazy

Lazy使用的地方和前兩者有些不同。 @Singleton和@Reusable一般用在provides或類型定義的地方,但Lazy則是用在使用時,它的使用效果和最開始講到的Supplier和Memoize類似。

@Inject Lazy lazySQLiteOpenHelper;

這裡不會先生成SQLiteOpenHelper實例,直到你開始呼叫lazySQLiteOpenHelper.get()。而一旦第一次實例化結束,以後的呼叫都會傳回第一次的結果。

Observable

在使用app的過程中,很多資料都需要從伺服器端取得。在我們app裡,每天會提供用戶一些訂製化內容,這些內容短期內不會改變,每次從伺服器端去取太過耗時,但放到資料庫或檔案這些持久化儲存裡似乎不太必要。綜合考慮後,似乎記憶體快取是不錯的選擇。

於是這個緩存需要提供以下功能,首先,它是個緩存,其次,它的結構需要很簡單,因為很多地方需要用到,再次,它得線程安全。

後來我們的實作方案很簡單,利用Retrofit和Observable提供的一些方法。

private static final long EXPIRE_MS = 5 * 60 * 1000; private Pair<Long, Observable>
cache; public synchronized Observable getDailyContent() { if (cache == null || cache.first + EXPIRE_MS < System.currentTimeMillis()) {
      cache = Pair.create(System.currentTimeMillis(), serverApi.getContent());
    } return cache.second;
  }

這個方法的本質是利用Retrofit返回的Observable對象,然後Observable會提供一個類似緩存的cache方法,這樣在subscribe之前,這個網絡請求不會被發出,但一旦有了結果,後來的調用者都會得到同樣的結果。

註 意

快取雖好,用起來很快捷方便,但在使用過程中,大家一定要注意資料更新和執行緒安全,不要出現髒資料。

來自:http://www.jointforce.com/jfperiodical/article/3516

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn