答えを3つの部分に分けます。プロファイリング、cを介したpythonコードの高速化、およびpythonを介したpythonの高速化。Pythonには、コードのパフォーマンスが実際のボトルネックにドリルダウンしているものを調べるための最良のツールがいくつかあるというのが私の見解です。プロファイルなしでコードを高速化することは、ウジで鹿を殺そうとするようなものです。
mat-vec製品にのみ興味がある場合は、scipy.sparseをお勧めします。
プロファイリング用のPythonツール
profileおよびcProfileモジュール:これらのモジュールは、標準のランタイム分析と関数呼び出しスタックを提供します。統計を保存してpstatsモジュールを使用すると、さまざまな方法でデータを表示できます。
kernprof:このツールは、行ごとのコードタイミングなどの処理を行うための多くのルーチンをまとめます
memory_profiler:このツールは、コードの行ごとのメモリフットプリントを生成します。
IPythonタイマー:timeit
関数は、関数の違いをすばやくインタラクティブに確認するのに非常に便利です。
Pythonの高速化
Cython:cythonは、Pythonでいくつかの関数を取得し、より高速なコードを取得する最も簡単な方法です。Pythonのcythonバリアントを使用して関数を修飾すると、cコードが生成されます。これは非常に保守的であり、c / c ++ / fortranの他の手書きコードにも簡単にリンクできます。今日では、はるかに好ましいツールです。
ctypes:ctypesを使用すると、cで関数を記述し、コードを簡単に装飾してすぐにラップできます。PyObjectsからキャストし、c関数を呼び出すためにgilを管理するすべての痛みを処理します。
Cでコードを記述するためのその他のアプローチもありますが、C / C ++ライブラリを使用してPythonでラップするためのアプローチはいずれもいくらか優れています。
Pythonのみのアプローチ
主にPythonの内部に滞在したい場合、私のアドバイスは、使用しているデータを把握し、アルゴリズムを実装するための正しいデータ型を選択することです。私の経験では、通常、データ構造を最適化してから低レベルのハックを行うことで、さらに遠くまで到達することができます。例えば:
numpy:配列のストライド操作に非常に高速なコンティンゴス配列
numexpr:numpy配列式オプティマイザー。それはnumpy配列式のマルチスレッド化を可能にし、Pythonインタープリターの制限のためにnumpyが作成する多数の一時的なものも取り除きます。
blist:リストのbツリー実装。リストの内部ノードの挿入、インデックス付け、移動が非常に高速です。
パンダ:データフレーム(またはテーブル)の配列の非常に高速な分析。
pytables:高速構造化された階層テーブル(hdf5など)、特にコアデータの計算や大きなデータへのクエリに適しています。