2011-01-06 13 views
7

pythonのマニュアルによれば、cPickleの方がPickleより速く、前者がCで実装されているということです。それはどういう意味ですか?Pythonでは、なぜC言語で実装されたモジュールが純粋なPythonモジュールより速く、どのように記述するのですか?

私はPythonで高度な数学のためのモジュールを作っていますが、いくつかの計算にはかなりの時間がかかります。それは私のプログラムがC言語で実装されていれば、はるかに高速化できるということですか?

このモジュールを他のPythonプログラムからインポートしたいのですが、私はcPickleをインポートすることができます。

CでPythonモジュールを実装する方法を説明できますか?

答えて

13

あなたは高速のCコードを書いて、それをあなたのpythonスクリプトで使うことができるので、あなたのプログラムはより速く動くでしょう。 [1] http://docs.python.org/extending/index.html#extending-index

の例は、C(http://numpy.scipy.org/)で書かれた、numpyのある

の典型的な使用は、Cのボトルネックを実現することである(またはコースのCで書かれたライブラリを使用します;))、その速度に起因する、とはcPickleはピクルス

編集よりも高速である理由[1]の方法で、これは残りのコード

のためのpythonを使用する:

はパイレックスを見てみましょう:http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/About.html

「パイレックスは特別に Pythonの拡張に モジュールを作成するために設計された言語です。素敵な、高レベルの間 ギャップを埋めるために設計されています、 のPythonの使いやすい世界とC.「

それだではない 『公式』の方法の 厄介な、低レベルの世界有用かもしれない。

+2

+1 Numpyを使って重い作業を行うPythonの実装に対して、コア計算の純粋なC実装をベンチマークする必要があります。 Numpyの実装が競争力を持つ可能性は十分あります。 Numpyの場合は – divegeek

+1

+1。 Numpyが望むことをすれば、コードを最適化するためにかなりの時間を費やすことなく、書くことができるよりも速くなるという非常に良い機会があります。 –

6

前述のように、numpyはベクトル計算には優れている。実際に仕事をしなくても書くことができるよりも優れているというコメントは間違いありません。

すべてが簡単にベクトル化できるわけではありませんが、たくさんの内部ループおそらく最も普及しているのはCythonなので、モジュールや関数を一種のPythonで書くことができ、必要なときにCのような速度を得ることができます。(大量の再帰的アルゴリズム)

多分あなたの時間は、eigenvaluesを計算するか、行列を反転するか、特別な関数を評価するか、本当に大きな整数を割り算するライブラリ呼び出しによって支配されています - 多くの場合、Sageプロジェクトは非常にうまく処理します。 Pythonで費やされる時間は問題ではないかもしれません。それはあなたがしている数値の種類の詳細に依存します。

3

すでに述べたパイレックス/ Cython、また、あなたは他の選択肢があります:

Shed Skin:C++に変換パイソン(の制限されたサブセット)。自動的に拡張子を生成することができます。

wget http://shedskin.googlecode.com/files/shedskin-0.7.tgz 
tar -xzf shedskin-0.7.tgz 
# On your code folder: 
PYTHONPATH=/path/to/shedskin-0.7 python shedskin -e yourmodule.py 
# The above generates a Makefile and a yourmodule.h/.cpp pair 
make 
# Now you can "import yourmodule" from Python and check it's from the .so by "print yourmodule.__file__ 

PyPy:高速化のPythonを、JITコンパイラを使用すると、(Linuxのを想定して)これを行う拡張機能を作成したいです。あなたは単にCPythonの代わりにあなたのコードを実行することができます。すぐにPython 2.5、2.7をサポートします。数学的に重いコードに大きなスピードアップを与えることができます。インストールして実行するには(仮定Linux 32ビット):

wget http://pypy.org/download/pypy-1.4.1-linux.tar.bz2 
tar -xjf pypy-1.4.1-linux.tar.bz2 
sudo ln -s /path/to/pypy-1.4.1-linux/bin/pypy /usr/local/bin 
# Then, instead of "python yourprogram.py" you'll just run "pypy yourprogram.py" 

Weave:それをコンパイルし、write C inlineにあなたを可能にします。

編集:あなたは私たちがあなたとベンチマークのために、これらのツールを実行したい場合は、単にあなたのコードを投稿し、あなたはPythonで関数を記述する場合)

5

、新しい関数オブジェクトが作成され、機能コードが解析され、 bytecompiled ["func_code"属性に保存されているので、その関数を呼び出すと、インタープリタはそのバイトコードを読み込んで実行します。

Pythonで使用できるようにC/Python APIの後に同じ関数を書くと、インタプリタは関数オブジェクトを作成しますが、この関数はバイトコードを持たないでしょう。 インタプリタがその関数を呼び出すと、実際のC関数を呼び出します。したがって、 "マシン"速度で実行され、 "python-machine"速度では実行されません。

あなたはCで書かれたこのチェック機能を確認することができます。

>>> map.func_code 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'builtin_function_or_method' object has no attribute 'func_code' 
>>> def mymap():pass 
... 
>>> mymap.func_code 
<code object mymap at 0xcfb5b0, file "<stdin>", line 1> 

あなたは公式サイトのガイドに従ってくださいPythonの使用のためのCコードを書くことができる方法を理解するために。

とにかく、N次元配列計算を行うだけなら、numpyで十分です。

+0

私はどこでもウェブ上で見つけることができない何か異なることをやっています、とにかくこれは助けてくれました、ありがとう! –

関連する問題