43

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)

$ time python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$ time cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

今、正直なところ、私は唖然としています。ここで使用したコードは純粋なPythonコードであり、変更したのはインタープリターだけです。この場合、cythonがこれほど優れているのなら、なぜ人々は従来のPythonインタープリターをまだ使用しているのでしょうか。Cythonに信頼性の問題はありますか?

4

7 に答える 7

55

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

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

  • 純粋なPythonコード: 20.4553578737秒
  • Cythonコード: 0.199339860234秒

これは100倍のスピードアップです。汚すぎる格好はやめて。

于 2010-04-23T16:11:12.047 に答える
18

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

つまり、cython が Python コードを c に変換するのにかかる時間を測定しているだけであり、そのバージョンのコードの実行速度は測定していません。

于 2010-04-23T10:17:46.187 に答える
10
  • cython test.pyx実際にはプログラムを実行しません。cythonバイナリは、CythonコードをPython拡張モジュールに処理するためのものです。実行するには、Pythonにインポートする必要があります。

  • #!/usr/bin/pythonPythonスクリプトに最適なシバンラインではありません。コマンドラインで実行さ#!/usr/bin/env pythonれるものは何でも実行するのが一般的に好まれます。python

    • Cythonpyxファイルには、有効なPythonプログラムである場合を除いて、おそらくシバン行を含めるべきではありません。
  • 投稿されたコードにIndentationErrorがあります。

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

于 2010-04-23T14:30:57.750 に答える
9

欠けていると思われる大きなポイント: Cython は Python の厳密なスーパーセットではありません。Python がサポートする機能がいくつかありますが、Cython はサポートしていません。最も注目すべきは、ジェネレーターとラムダ (ただし、それらは来る予定です)。

于 2010-06-08T00:29:51.040 に答える
3
  • Cython がそれほど普及していない最大の理由は、スタンドアロン (Python なし) の実行可能ファイルがないことです。

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

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

于 2010-12-15T00:01:04.283 に答える
2

cython が実際にプログラムを 1 行でコンパイルして実行することを望む人のために、runcython ( http://github.com/russell91/runcython ) を作成しました。runcython test.pyxOPが意図したセマンティクスを持つ

于 2015-03-20T23:44:38.180 に答える
0

あなたがcythonで言及した時間を示唆するコメントの多くは、.pyファイルを.cファイルに変換するのにかかった時間です。その .c ファイルは、メモリの点で大きなものになります。利点は、C コンパイラも使用してその .c ファイルをコンパイルできることです。

1 つの例を示します。Python ファイルがある場合は、.pyx ファイルとして保存する必要があります。「cython xyz.pyx」を実行すると、.c および .so ファイルが作成されます

cythonコマンドで作成した画像ファイルをチェックインし てみましょう

私の場合、サイズも増加し、バイトからキロバイトに変更されました

このリンクを参照できるPythonコードをコンパイルする特定の方法があります:

http://cython.readthedocs.io/en/latest/src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

私が気付いたもう1つのことは、組み込みプロジェクトに実装しようとすると、cythonのメモリの問題について言及されていないことです。多くのメモリの問題に直面しています。

コンパイルに余分な労力を費やす必要がなく、コンパイル時間の面でも時間を短縮できる pypy を試すことができます

写真を参照してください: pythonとpypyの時間を比較してください

ありがとうございました..

于 2018-04-03T06:25:55.547 に答える