2

Python 2 と Python 3 で実行するプログラムがありますが、速度に大きな違いがあります。スイッチで多くの内部変更が行われたことは理解していますが、io.BufferedReader の違いは非常に大きいです。どちらのバージョンでも、io.BufferedReader を使用します。これは、メイン プログラム ループが一度に 1 バイトのデータしか必要としないためです。以下は、スクリプトの cProfile 出力からの抜粋です ( tottimeではなく cumtime を参照してください)。

Python 2:
 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 36984   0.188    0.000    0.545    0.000   io.py:929(read)

Python 3:
 36996    0.063   0.000    0.063    0.000   {method 'read' of '_io.BufferedReader' objects}

オブジェクトを印刷すると、どちらも次のようなものを返すio.BufferedReaderので、どちらも BufferedReader を使用していると確信しています。

これが問題のコードです。行 28 を参照してください。呼び出し元は、bufstream を設定する責任があります。使ったbufstream = io.open('testfile', 'rb')

ファイル内の単一バイトを読み取るための BufferedReader の速度に劇的な違いがあるのはなぜですか? Python 2.x の問題を「修正」するにはどうすればよいですか? Python 2.6 と Python 3.1 を実行しています。

4

2 に答える 2

6

より完全な答えを得るには、コード (または、コードの実行可能ファイル) を確認する必要があります。

ただし、プロファイル出力から部分的な回答を収集できます。io.py「Python 2」(疑いを避けるために、実際のバージョン番号を示します) は Python で BufferedReader を実装し_io.BufferedReaderていることを示唆していますが、「Python3」は C で実装していることを示唆しています。

最新ニュース: Python 2.6io.pyは 64Kb を超えており、先頭に次のコメントが含まれています。

# This is a prototype; hopefully eventually some of this will be
# reimplemented in C.

Python 2.7は約 4Kb で、モジュールio.pyの薄いラッパーのように見えます。_io

2.6 の回避策について実際の支援が必要な場合は、コードを表示してください。

Python 2.6 で考えられる回避策

それ以外の:

test = io.open('test.bmp', 'rb')

これを行う:

test = open('test.bmp', 'rb')

欠落しているリンク (Python 2.7) を含む、いくつかの大まかなタイミング図:

Windows 7 Pro、32 ビット、約 5 Mb のファイル、コードの内容は次のとおりです。

while 1:
    c = f.read(1)
    if not c: break

2.6: io.open 20.4s, open 5.1s
2.7: io.open  3.3s, open 4.8s # io.open is better
3.1: io.open  3.6s, open 3.6s # effectively same code is used

したがって、より良い話は次のように思われます: 一般に、2.7 をより速くしたいなどの正当な理由がない限り、io.open を気にしないでください。

于 2010-12-25T19:53:10.563 に答える
4

2.7 を使用すると、これが解決されます。PEP 3116およびPython 2.7 docを参照してください。

モジュール io の一部は2.6 では python で書かれていますが、2.7+ではモジュール全体が C で書かれています。

于 2010-12-25T19:55:30.767 に答える