145

Pythonを(おそらく中間のC表現を介して)マシンコードにコンパイルすることはどれほど実現可能でしょうか?

おそらく、Pythonランタイムライブラリにリンクする必要があり、Python自体であるPython標準ライブラリの部分もコンパイル(およびリンク)する必要があります。

また、式の動的評価を行う場合はPythonインタープリターをバンドルする必要がありますが、これを許可しなかったPythonのサブセットは依然として有用です。

速度やメモリ使用量の利点はありますか?おそらく、Pythonインタープリターの起動時間はなくなります(ただし、共有ライブラリは起動時にロードする必要があります)。

4

10 に答える 10

56

@Greg Hewgillが言っているように、これが常に可能であるとは限らない正当な理由があります。ただし、特定の種類のコード (非常にアルゴリズム的なコードなど) は、「実際の」マシン コードに変換できます。

いくつかのオプションがあります:

  • マシンコードを動的に発行するPsycoを使用します。ただし、変換するメソッド/関数を慎重に選択する必要があります。
  • Python C 拡張機能にコンパイルされる Python にた言語であるCythonを使用します。
  • RPython ( Python の最も「動的な」機能の一部をサポートしない Python の制限付きサブセット) から C または LLVM へのトランスレータを持つPyPyを使用します。
    • PyPy はまだ非常に実験的です
    • すべての拡張機能が存在するわけではありません

その後、既存のパッケージ (freeze、Py2exe、PyInstaller) のいずれかを使用して、すべてを 1 つのバイナリに入れることができます。

全体として、あなたの質問に対する一般的な答えはありません。パフォーマンスが重要な Python コードがある場合は、できるだけ多くの組み込み機能を使用するようにしてください (または、「Python コードを高速化するにはどうすればよいか」という質問をしてください)。それでも問題が解決しない場合は、コードを特定して C (または Cython) に移植し、拡張機能を使用してみてください。

于 2008-09-26T10:06:43.200 に答える
34

ShedSkin Python-to-C++ コンパイラを試してみてください。ただし、完璧にはほど遠いものです。スピードアップだけが必要な場合は、Psyco - Python JIT もあります。しかし、これは努力する価値がありません。コードの速度が重要な部分については、C/C++ 拡張機能として記述するのが最善の解決策です。

于 2008-09-26T10:00:15.553 に答える
17

Nuitkaは、libpython にリンクする Python から C++ へのコンパイラです。比較的新しいプロジェクトのようです。著者は、pystone ベンチマークで CPython よりも速度が向上したと主張しています。

于 2014-04-09T03:52:37.577 に答える
15

PyPyは、実装戦略の 1 つとしてネイティブ コードへのコンパイルを使用して、Python で Python を再実装するプロジェクトです (JIT を使用した VM、JVM の使用など)。コンパイルされた C バージョンは、平均して CPython よりも遅く実行されますが、一部のプログラムでははるかに高速です。

Shedskinは、実験的な Python-to-C++ コンパイラです。

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

于 2008-09-26T10:06:06.680 に答える
10

Pyrexは C にコンパイルされる Python 言語のサブセットであり、Python のリスト内包表記を最初に作成した人物によって作成されました。主にラッパーを構築するために開発されましたが、より一般的なコンテキストで使用できます。 Cythonは、より積極的に維持されている pyrex のフォークです。

于 2008-09-26T10:06:46.413 に答える
5

いくつかの追加の参照:

于 2015-08-30T06:27:35.510 に答える
3

Jython には、JVM バイトコードを対象とするコンパイラがあります。バイトコードは、Python 言語自体と同様に完全に動的です! とてもかっこいい。(はい、Greg Hewgill の回答が暗示しているように、バイトコードは Jython ランタイムを使用するため、Jython jar ファイルをアプリと共に配布する必要があります。)

于 2008-09-26T10:00:16.740 に答える
2

Psycoは一種のジャストインタイム(JIT)コンパイラです。Python用の動的コンパイラで、コードを2〜100倍高速に実行しますが、多くのメモリを必要とします。

つまり、既存のPythonソフトウェアをはるかに高速に実行し、ソースを変更することはありませんが、Cコンパイラと同じようにオブジェクトコードにコンパイルすることはできません。

于 2008-09-26T09:59:12.297 に答える
2

答えは「はい、可能です」です。Python コードを取得し、CPython API を使用して同等の C コードにコンパイルすることを試みることができます。実際、まさにそれを行っていた Python2C プロジェクトがありましたが、私は何年もそのことを聞いていませんでした (私が最後に見たのは Python 1.5 の頃です)。

可能な限り Python コードをネイティブ C に変換し、実際の Python 機能が必要な場合は CPython API にフォールバックすることができます。私は先月か 2 か月、自分でそのアイデアをいじっていました。しかし、それは非常に多くの作業であり、非常に多くの Python 機能を C に変換するのは非常に困難です: ネストされた関数、ジェネレータ、単純なメソッドを持つ単純なクラス以外のもの、モジュールの外部からモジュール グローバルを変更することを含むものなどなど

于 2008-09-26T10:14:09.843 に答える