11

Python のドキュメントには、cPickle が Pickle よりも高速である理由は、前者が C で実装されていることが記載されています。それは正確にはどういう意味ですか?

Python で高度な数学のモジュールを作成していますが、一部の計算にはかなりの時間がかかります。これは、私のプログラムが C で実装されていれば、はるかに高速にできるということですか?

cPickle をインポートできるように、このモジュールを他の Python プログラムからインポートしたいと考えています。

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

4

4 に答える 4

17

高速な C コードを記述して Python スクリプトで使用できるため、プログラムの実行速度が向上します[1]。 http://docs.python.org/extending/index.html#extending-index

例は C で書かれた Numpy です ( https://numpy.org/ )

典型的な使用法は、ボトルネックを C で実装すること (または、もちろん C で書かれたライブラリを使用することです ;))、その速度のために、残りのコードには python を使用することです。

[1] ちなみに、これが cPickle が pickle より速い理由です

編集:

Pyrex を見てみましょう: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/About.html

'Pyrex は、Python 拡張モジュールを作成するために特別に設計された言語です。これは、素晴らしく高レベルで使いやすい Python の世界と、乱雑で低レベルの C の世界との間のギャップを埋めるように設計されています。」

それは「公式」の方法ではありませんが、役に立つかもしれません

于 2011-01-06T14:54:08.413 に答える
10

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

ただし、すべてを簡単にベクトル化できるわけではないため、関数呼び出しが多いタイトな内部ループ(たとえば、非常に再帰的なアルゴリズム)がある場合でも、いくつかのオプションがあります。おそらく最も人気のあるのは、モジュールを記述できるCythonです。一種の注釈付きPythonで機能し、必要なときにCのような速度を実現します。

あるいは、固有値を計算したり、行列を反転したり、特殊関数を評価したり、非常に大きな整数を分割したりするためのライブラリ呼び出しが時間の大半を占めている可能性があります。ちなみに、 Sageプロジェクトの多くは、より数学的なものであれば、非常にうまく処理されます。純粋なクランチよりも-その場合、Pythonで費やした時間は重要ではないかもしれません。それはすべて、あなたがしている数値の種類の詳細に依存します。

于 2011-01-06T15:26:47.973 に答える
9

Pythonで関数を書くと、新しい関数オブジェクトが作成され、関数コードが解析されてバイトコンパイルされます[そして「func_code」属性に保存されます]。そのため、その関数を呼び出すと、インタープリターはそのバイトコードを読み取って実行します。

C で同じ関数を記述し、C/Python API に従って Python で使用できるようにすると、インタープリターは関数オブジェクトを作成しますが、この関数にはバイトコードがありません。インタープリターがその関数の呼び出しを見つけると、実際の C 関数を呼び出すため、「python-machine」の速度ではなく「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 で十分です。

于 2011-01-08T17:33:45.683 に答える
7

既に述べた Pyrex/Cython の他に、他の選択肢があります。

Shed Skin : Python (の制限付きサブセット) を C++ に変換します。拡張機能を自動的に生成できます。これを行う拡張機能を作成します(Linuxを想定):

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 : JIT コンパイラを備えたより高速な Python。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 : C を inlineで記述できるようにし、コンパイルします。

編集: これらのツールを実行してベンチマークしたい場合は、コードを投稿してください ;)

于 2011-01-06T20:30:09.147 に答える