ホームページ >バックエンド開発 >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 を使用して 1,000,000 内の素数を見つけ、このプロセスを 10 回繰り返し、実行時間を計算してみましょう。

Supplier と Memoize

SQLite は Android で一般的に使用されるデータ保存方法であり、データベース データにアクセスする場合は SQLiteOpenHelper を使用する必要があります。

優れたデータベース接続コードは、次の問題を解決できる必要があります: a) インスタンスの構築は、比較的リソースを大量に消費します。 b) データベース接続を再利用するのが最善です。 c) OnUpdate および他のメソッドは、実行中に他のインスタンスと競合できません。

このように簡単に書くことができます

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

このコードは、Guava が提供するいくつかの補助メソッドを使用して、Supplier、Memoize、ロジックを実装します。名前が示すように、サプライヤーは通常、工場、発電機、ビルダー、クロージャとして使用されます。 Memoize はキャッシュの概念に似ており、インスタンスを生成すると、後続の呼び出しで同じインスタンスを返します。また、スレッドセーフです。

このように記述することには、いくつかの利点があります。まず、必要な場合にのみインスタンスを構築し、最初のプログラムの実行をブロックしません。次に、memoize を使用してキャッシュを実装し、インスタンスが 1 つだけ生成されるようにします。

コードインジェクション

Glow はコードインジェクションのヘビーユーザーであり、コードをより構造化され、明確かつシンプルにすると同時に、開発時間を大幅に節約します。

Dagger 2 はインジェクション用のツールです。興味のある学生は、Web サイトにアクセスして関連コンテンツの詳細を確認してください。インジェクションに加えて、キャッシュの実装に使用できるボーナス関数もいくつかあり、追加のアノテーションまたはインターフェイスをいくつか使用するだけで非常に簡単です。

@Singleton

これは面接中によく聞かれる質問ですので、誰もがよく知っているはずです。簡単に言うとシングルトンです。これにより、これらのインスタンスをキャッシュする方法について心配する必要がなくなるからです。

@Singleton public class SingletonClass {  
}

@Reusable

これは新しい素晴らしい機能です。シングルトンは非常に優れていますが、インスタンスが大きすぎてメモリ内に保持され、プログラムが当面使用できない場合があるため、少し無駄に感じます。多くの場合、インスタンスが 1 つだけ必要になるような厳密な要件はありません。再利用できる場合は、それを再利用します。このシナリオでは、すでに生成されたインスタンスがある場合、再インスタンス化する必要はありません。可能ですが、保証は必要ありません。

@Reusable public class ReusableClass {  
}

Lazy

Lazyの使われる場所が前の2つとは少し異なります。 @Singleton と @Reusable は通常、provide または type 定義で使用されますが、Lazy を使用する場合、その使用効果は冒頭で説明した Supplier と Memoize に似ています。

@Inject Lazy lazySQLiteOpenHelper;

SQLiteOpenHelper インスタンスは、lazySQLiteOpenHelper.get() の呼び出しを開始するまで生成されません。最初のインスタンス化が完了すると、後続の呼び出しでは最初の結果が返されます。

Observable

アプリを使用する過程で、サーバー側から大量のデータを取得する必要があります。私たちのアプリでは、カスタマイズされたコンテンツを毎日ユーザーに提供していますが、このコンテンツは短期間では変更されません。毎回サーバーから取得するのは時間がかかりますが、保存するのは簡単ではないようです。データベースやファイルなどの永続ストレージに必要です。すべてのことを考慮した結果、メモリ キャッシュが良い選択であるように思えます。

したがって、このキャッシュは次の機能を提供する必要があります。第 2 に、多くの場所で使用する必要があるため、その構造は非常に単純である必要があります。第 3 に、スレッドセーフである必要があります。

その後、私たちの実装計画は非常にシンプルで、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 はキャッシュのようなメソッドを提供するため、サブスクライブする前にネットワーク リクエストは発行されませんが、結果が利用可能になると、後続の呼び出し元は同じ結果が得られます。

注意

キャッシュは優れており高速で使いやすいですが、使用中は誰もがデータの更新とスレッドの安全性に注意を払い、ダーティなデータを避ける必要があります。

出典: http://www.jointforce.com/jfperiodical/article/3516

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。