24

コード(約30K LOC)をCPythonからJythonに移動して、Javaコードとの統合を改善することを検討しています。

移行を支援するために確認する必要のあるチェックリストまたはガイドはありますか?誰かが似たようなことをした経験がありますか?

Jythonのサイトを読んだところ、ほとんどの問題は私を悩ませることができないほど曖昧に思えます。

私はそれに気づきました:

  • スレッドセーフが問題です
  • Unicodeのサポートはかなり異なっているようですが、これは私にとって問題になる可能性があります
  • mysqldbが機能しないため、zxJDBCに置き換える必要があります

他に何か?

関連する質問:CPython、Jython、IronPythonで動作するPythonコードを作成するためのいくつかの戦略は何ですか

4

6 に答える 6

10

まず、Jython の実装は非常に優れていると言わざるを得ません。ほとんどのことは「うまくいく」。

ここに私が遭遇したいくつかのことがあります:

  • もちろん、Cモジュールは利用できません。

  • open('file').read() はファイルを自動的に閉じません。これは、ガベージ コレクターの違いに関係しています。これにより、開いているファイルが多すぎるという問題が発生する可能性があります。「with open('file') as fp」イディオムを使用することをお勧めします。

  • 現在の作業ディレクトリの設定 (os.setcwd() を使用) は、Python コードでは機能しますが、Java コードでは機能しません。ファイル関連のすべてについて現在の作業ディレクトリをエミュレートしますが、Jython に対してのみエミュレートできます。

  • XML 解析は、利用可能な場合、外部 DTD を検証しようとします。これにより、パーサーがネットワーク経由で DTD をダウンロードするため、XML 処理コードが大幅に遅くなる可能性があります。この問題を報告しましたが、今のところ未修正のままです。

  • __ del __ メソッドは、オブジェクトへの最後の参照が削除された直後ではなく、Jython コードの非常に遅い段階で呼び出されます。

相違点の古いリストがありますが、最近のリストはありません。

于 2010-04-05T13:03:03.387 に答える
8

これまでのところ、さらに 2 つの問題に気付きました。

  • 文字列インターン 'a' is 'a' は保証されていません (これは CPython での単なる実装のまぐれです)。これは深刻な問題になる可能性があり、実際に移植したライブラリの 1 つ (Jinja2) にありました。単体テストは (いつものように) あなたの親友です!
Jython 2.5b0 (トランク:5540、2008 年 10 月 31 日、13:55:41)
>>>「あ」は「あ」
真実
>>> s = 'a'
>>> 'a' は s
間違い
>>> 'a' == s   
真実
>>> intern('a') はインターンです
真実

CPython での同じセッションを次に示します。

Python 2.5.2 (r252:60911、2008 年 10 月 5 日、19:24:49)
>>>「あ」は「あ」
真実
>>> s = 'a'
>>> 'a' は s
真実
>>> 'a' == s
真実
>>> intern('a') はインターンです
真実

  • os.spawn* 関数は実装されていません。代わりに、subprocess.call を使用してください。subprocess.call を使用した実装は簡単で、パッチを受け入れると確信しているので、本当に驚きました。

(私はあなたと同様のことをしており、最近アプリを移植しています)

于 2009-01-07T17:01:35.137 に答える
5

私はこれを他の回答と私の経験から集めたウィキとして始めています。自由に編集して追加してください。ただし、壊れたもののリストではなく、実用的なアドバイスに固執するようにしてください。これは、Jythonサイトとの違いの古いリストです。

資源管理

Jythonは参照カウントを使用しないため、リソースはガベージコレクションとして解放されます。これは、同等のCPythonプログラムで表示されるよりもはるかに後のことです。

  • open('file').read()ファイルを自動的に閉じません。with open('file') as fpイディオムを使用することをお勧めします。
  • __ del __メソッドは、オブジェクトへの最後の参照が削除された直後ではなく、Jythonコードの非常に遅い段階で呼び出されます。

MySQL統合

mysqldbacモジュールであるため、jythonでは機能しません。代わりに、com.ziclix.python.sql.zxJDBCJythonにバンドルされているを使用する必要があります。

次のMySQLdbコードを置き換えます。

connection = MySQLdb.connect(host, user, passwd, db, use_unicode=True, chatset='utf8')

と:

url = "jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" % (host, db)
connections = zxJDBC.connect(url, user, passwd, "com.mysql.jdbc.Driver")

_mysql_exceptionまた、すべてをに置き換える必要がありますzxJDBC

%s最後に、クエリプレースホルダーをからに置き換える必要があります?

Unicode

  • Jythonでは不正なUnicode文字を表現することはできません。のようなことを試みるunichr(0xd800)と例外が発生し、コードにリテラルが含まれているu'\ud800' と大混乱を引き起こします。

足りないもの

  • もちろん、Cモジュールは利用できません。
    • したがって、NumPySciPyはありません。
  • os.spawn*関数は実装されていません。代わりにsubprocess.callを使用してください。

パフォーマンス

  • ほとんどのワークロードでは、JythonはCPythonよりもはるかに低速です。レポートは3〜50倍遅くなります。

コミュニティ

Jythonプロジェクトはまだ生きていますが、動きが速いわけではありません。devメーリングリストには 月に約20のメッセージがあり、最近コードをコミットしている開発者は約2人しかないようです。

于 2010-12-19T07:31:54.273 に答える
3

JPypeを調査することもできます。Jython と比較してどの程度成熟しているかはわかりませんが、CPython が Java コードにアクセスできるようになるはずです。

于 2010-04-05T13:10:55.233 に答える
3

少し前にプロジェクトを CPython から Jython に切り替えたとき、タイム クリティカルなセクションで最大 50 倍の速度低下を実現しました。そのため、私は CPython にとどまりました。

ただし、現在のバージョンでは変更されている可能性があります。

于 2009-05-11T11:03:51.723 に答える
2

最近、私は学校の教授のためにグループでプロジェクトに取り組みました。早い段階で、プロジェクトを Python で作成することが決定されました。間違いなく CPython を使用するべきでした。Python でプログラムを作成し、すべての単体テストが最終的に機能しました。ほとんどの人はすでにコンピューターに Python ではなく Java をインストールしているため、Jython jar としてデプロイすることにしました。そのため、Java の標準ライブラリに含まれている Swing で GUI を作成しました。

Jython で初めてプログラムを実行したとき、すぐにクラッシュしました。1 つには、csv.reader の「.fieldnames」が常に None のように見えました。したがって、これを回避するには、コードのいくつかの部分を変更する必要がありました。

コードの別のセクションもクラッシュしましたが、CPython では問題なく動作しました。Jython は、何かが割り当てられる前に変数を参照したと私を非難しました (それは私を狂わせましたが、実際にはそうではありませんでした)。これは一例です: ActiveState の Code Recipe の外部ソート

さらに悪いことに、パフォーマンスはひどいものでした。基本的に、このコードはいくつかの CSV ファイルを組み合わせたもので、そのうちの 1 つが約 2 GB でした。CPython では、8.5 分で実行されました。Jython では、25 分で実行されました。

これらの問題は 2.5.2rc2 (この記事を書いている時点で最新のもの) で発生しました。

于 2010-12-16T21:28:04.387 に答える