web-dev-qa-db-ja.com

Cython Speed Boostと使いやすさ

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の信頼性の問題はありますか?

42
user277465

他の回答は、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"

そしてそれをコンパイルして、私は次の時間を得ました:

  • Pure Python code:20.4553578737秒
  • Cythonコード:0.199339860234秒

これは100倍の高速化です。汚すぎる格好はやめて。

53
Justin Peel

Cythonは別の通訳ではありません。 python(-like)コードから、Python用のc-extensionsを生成します。 cython test.pyxは、 'test.c'ファイルのみを生成します。このファイルは(コンパイルすると)通常のpythonライブラリと同じようにpython=)で使用できます。

つまり、cythonがpythonコードをcに変換するのにかかる時間のみを測定しているのであって、そのバージョンのコードの実行速度ではないことを意味しています。

18
Steven
  • cython test.pyxは実際にはプログラムを実行しません。 cythonバイナリは、CythonコードをPython拡張モジュールに処理するためのものです。それを実行するには、Pythonにインポートする必要があります。

  • #!/usr/bin/pythonはPythonスクリプトの最適なシバン行ではありません。#!/usr/bin/env pythonが一般的に推奨されており、コマンドラインでpythonを実行します。

    • Cython pyxファイルは、有効なPythonプログラムである場合を除いて、Shebang行を含むべきではありません。
  • 投稿されたコードにIndentationErrorがあります。

  • 従来のインタープリターを使用すると、より簡単で移植性が高くなります。 Cythonは信頼性がありますが、制限と癖があります。それはあなたのタイミングがそれがそうであるように見えるようにスピードアップを魔法のように与えたならば、それをもっとたくさん使用するのは説得力があるかもしれませんが、それは実際により小さいものを与えます。多くの高速化を確認するには、C機能を使用するためにCython固有の機能の使用を開始する必要があります。

9
Mike Graham

不足しているように見える大きな点:CythonはPythonの厳密なスーパーセットではありません。 Python=がサポートしている機能がいくつかありますが、Cythonはサポートしていません。特に、ジェネレータとラムダ(ただし、それらは追加されます)です。

9
carl
  • Cythonがそれほど普及していない最大の理由は、スタンドアロン(Pythonなし)の実行可能ファイルがないことです。

  • 宣伝の欠如。開発者は、最先端の言語よりもSageソフトウェアの開発に関心がある学者のようです。

  • 開発中に遭遇する落とし穴。私が遭遇したのは、真のスレッドのサポートの欠如です。すべてがグローバルインタープリターロックにラップされ、スレッドセーフになりますが、同時実行性は無効になります。

2
unixman83

そのcythonを実際に1行でコンパイルして実行することを希望する人のために、runcython( http://github.com/russell91/runcython )を作成しました。 runcython test.pyxは、OPが意図したセマンティクスを持ちます

2
RussellStewart