Pythonコードを最適化する方法を探していたときに、Cythonに出くわしました。私は、stackoverflow、python wikiに関するさまざまな投稿を読み、記事「最適化の一般的なルール」を読みました。
Cythonは私の興味を最もよく理解するものです。自分でCコードを記述する代わりに、pythonコード自体に他のデータ型を含めることを選択できます。
これは私が試した愚かなテストです、
#!/usr/bin/python
# test.pyx
def test(value):
for i in xrange(value):
i**2
if(i==1000000):
print i
test(10000001)
$時間python test.pyx
real 0m16.774s
user 0m16.745s
sys 0m0.024s
$時間cython test.pyx
real 0m0.513s
user 0m0.196s
sys 0m0.052s
正直なところ、私はびっくりしました。ここで使用したコードは純粋なpythonコードであり、変更したのはインタープリターだけです。この場合、cythonがこれほど優れているのに、なぜ従来のPythonインタープリターがまだ使用されているのでしょうか。 Cythonの信頼性の問題はありますか?
他の回答は、Cythonコードを実行するのではなく、コンパイルする方法を説明しています。しかし、あなたはCythonがあなたのコードをどれだけ速く作ることができるか知りたいかもしれないと思った。 distutils
を使用して(別のモジュールから関数を実行しましたが)持っているコードをコンパイルすると、ストレートPythonに比べて速度がわずかに向上しました約1%。ただし、コードにいくつかの小さな変更を加えたとき:
def test(long long value):
cdef long long i
cdef long long z
for i in xrange(value):
z = i**2
if(i==1000000):
print i
if z < i:
print "yes"
そしてそれをコンパイルして、私は次の時間を得ました:
これは100倍の高速化です。汚すぎる格好はやめて。
Cythonは別の通訳ではありません。 python(-like)コードから、Python用のc-extensionsを生成します。 cython test.pyx
は、 'test.c'ファイルのみを生成します。このファイルは(コンパイルすると)通常のpythonライブラリと同じようにpython=)で使用できます。
つまり、cythonがpythonコードをcに変換するのにかかる時間のみを測定しているのであって、そのバージョンのコードの実行速度ではないことを意味しています。
cython test.pyx
は実際にはプログラムを実行しません。 cython
バイナリは、CythonコードをPython拡張モジュールに処理するためのものです。それを実行するには、Pythonにインポートする必要があります。
#!/usr/bin/python
はPythonスクリプトの最適なシバン行ではありません。#!/usr/bin/env python
が一般的に推奨されており、コマンドラインでpython
を実行します。
pyx
ファイルは、有効なPythonプログラムである場合を除いて、Shebang行を含むべきではありません。投稿されたコードにIndentationErrorがあります。
従来のインタープリターを使用すると、より簡単で移植性が高くなります。 Cythonは信頼性がありますが、制限と癖があります。それはあなたのタイミングがそれがそうであるように見えるようにスピードアップを魔法のように与えたならば、それをもっとたくさん使用するのは説得力があるかもしれませんが、それは実際により小さいものを与えます。多くの高速化を確認するには、C機能を使用するためにCython固有の機能の使用を開始する必要があります。
不足しているように見える大きな点:CythonはPythonの厳密なスーパーセットではありません。 Python=がサポートしている機能がいくつかありますが、Cythonはサポートしていません。特に、ジェネレータとラムダ(ただし、それらは追加されます)です。
Cythonがそれほど普及していない最大の理由は、スタンドアロン(Pythonなし)の実行可能ファイルがないことです。
宣伝の欠如。開発者は、最先端の言語よりもSageソフトウェアの開発に関心がある学者のようです。
開発中に遭遇する落とし穴。私が遭遇したのは、真のスレッドのサポートの欠如です。すべてがグローバルインタープリターロックにラップされ、スレッドセーフになりますが、同時実行性は無効になります。
そのcythonを実際に1行でコンパイルして実行することを希望する人のために、runcython( http://github.com/russell91/runcython )を作成しました。 runcython test.pyx
は、OPが意図したセマンティクスを持ちます