1

Python 3.2 の変更点を読み、3.1 よりも多くの改善が行われていることを理解しました。ただし、まったく同じコードを 3.2 で実行すると、コードを 3.1.3 で実行した場合よりも 10 倍以上遅くなります。

Python 3.2 では、ファイルのバイナリ コンテンツを物理デバイスに転送し、受信したデータを受信して​​画面に出力するのに 6 分かかりましたが、Python 3.1.3 では、まったく同じシナリオを同じ PC で実行するのに 30 秒しかかかりませんでした。

私は Python 3.1.2 でコードをゼロから開発しましたが、私のコードの 20% は ctypes を使用して、USB/PCI デバイスで Windows ドライバーを介してトランザクションを実行しているため、このパフォーマンスの低下は下位互換性とは何の関係もないと思います。私のアプリケーションでは、threading.Thread サブクラスの 4 つのインスタンスを作成し、それぞれがシステム上の 1 つの PCI または USB デバイスを処理します。私が疑うのは、3.2 の ctypes のパフォーマンスがこれまで以上に悪化したか、または、必要なマルチスレッド パフォーマンスを正確に得るために使用しなければならない threading.Thread が増えていることです。誰かが私のためにいくつかのライトを陰にすることができれば大歓迎です

=========================================

より診断的

送受信するデータ量を減らしました

このシステム リソース モニターのスクリーンショットhttp://img62.imageshack.us/img62/5313/python313.pngに示すように、python 3.1.3 は comelete に 3 秒を費やします。

このシステム リソース モニターのスクリーンショットhttp://img197.imageshack.us/img197/8366/python32.pngに示すように、python 3.2 は完了するまでに約 1 分かかります。

私の PC は 2 GB の RAM を搭載したシングル コア Intel P4 であるため、マルチ コア プロセッサの GIL 要因を除外できると思います。

yappi を使用して複数の実行をプロファイリングし、3.1.3 と 3.2 の両方でパフォーマンス結果を平均化しました。Python 3.2 では、スレッド化と ctypes のパフォーマンスが悪いようです。

これは、python パッケージの標準 Windows バイナリで提供されるスレッド セーフ キューにアクセスしています。

on 3.1.3
name                                 #n       tsub       ttot       tavg
C:\Python31\lib\queue.py.qsize:86    46070    1.352867   4.234082   0.000092
C:\Python31\lib\queue.py._get:225    8305     0.012457   0.017030   0.000002
C:\Python31\lib\queue.py.get:167     8305     0.635926   1.681601   0.000202
C:\Python31\lib\queue.py._put:221    8305     0.016156   0.020717   0.000002
C:\Python31\lib\queue.py.put:124     8305     0.095320   1.138560   0.000137

on 3.2
name                                 #n       tsub       ttot       tavg
C:\Python32\lib\queue.py.qsize:86    252168   4.987339   15.229308  0.000060
C:\Python32\lib\queue.py._get:225    8305     0.030431   0.035152   0.000004
C:\Python32\lib\queue.py.get:167     8305     0.303126   7.898754   0.000951
C:\Python32\lib\queue.py._put:221    8305     0.015728   0.020928   0.000003
C:\Python32\lib\queue.py.put:124     8305     0.143086   0.431970   0.000052

Python 3.2 ではスレッド単位のパフォーマンスがめちゃくちゃ悪い

もう一つの例。この関数は、単に ctypes モジュールを介して Windows USB ドライバーの API を呼び出し、USB デバイスから 16 ビットのデータを要求します。

on 3.1.3
name                                 #n       tsub       ttot       tavg
..ckUSBInterface.py.read_register:14 1        0.000421   0.000431   0.000431
on 3.2
name                                 #n       tsub       ttot       tavg
..ckUSBInterface.py.read_register:14 1        0.015637   0.015651   0.015651

ご覧のとおり、かかる時間は Python 3.2 では 30 倍以上悪化しています。

Python 3.2 は私のアプリケーションにとって大惨事のようです

4

1 に答える 1

2

これが必要な明確な理由はありません。この追加の時間がかかるものを正確に確認するには、アプリをプロファイリングする必要があります。

于 2011-04-21T23:22:19.547 に答える