2

大きなファイル (~100MB) を考えてみましょう。ファイルが行ベース (比較的短い行 ~80 文字のテキスト ファイル) であると考えてみましょう。組み込みのopen()/を使用file()すると、ファイルは遅延してロードされます。IE を実行aFile.readline()すると、ファイルのチャンクのみがメモリに常駐します。urllib.urlopen() は (ディスク上のキャッシュを使用して) 同様のことを行いますか?

urllib.urlopen().readline()とのパフォーマンスの違いはどれくらいfile().readline()ですか? ファイルが localhost にあると考えてみましょう。で開きurllib.urlopen()、次にで開きfile()ます。でファイルをループすると、パフォーマンス/メモリ消費の違いはどれくらいになりますreadline()か?

経由で開かれたファイルを処理する最良の方法は何urllib.urlopen()ですか? 行ごとに処理する方が速いですか?または、一連の行(〜50)をリストにロードしてから、リストを処理しますか?

4

2 に答える 2

2

open(またはfile)そしてurllib.urlopen、彼らは多かれ少なかれそこで同じことをしているように見えます. urllib.urlopen(基本的に) を作成してsocket._socketobjectからメソッドを呼び出しますmakefile(そのメソッドの内容は以下に含まれます)

def makefile(self, mode='r', bufsize=-1):
    """makefile([mode[, bufsize]]) -> file object

    Return a regular file object corresponding to the socket.  The mode
    and bufsize arguments are as for the built-in open() function."""
    return _fileobject(self._sock, mode, bufsize)
于 2011-08-26T05:48:23.100 に答える
1

urllib.urlopen() は (ディスク上のキャッシュを使用して) 同様のことを行いますか?

オペレーティングシステムが行います。などのネットワーク API を使用するurllibと、オペレーティング システムとネットワーク カードは、ネットワーク経由で送信される小さなパケットにデータを分割し、着信パケットを受信する低レベルの作業を行います。これらはキャッシュに保存されるため、アプリケーションはパケットの概念を抽象化し、データの連続ストリームを送受信するふりをすることができます。

urllib.urlopen().readline()とのパフォーマンスの違いはどれくらいfile().readline()ですか?

この二つを比較するのは難しい。の場合urllib、これはネットワークの速度とサーバーの速度によって異なります。ローカル サーバーの場合でも、抽象化のオーバーヘッドがあるため、通常、ファイルから直接読み取るよりもネットワーク API から読み取る方が遅くなります。

実際のパフォーマンスを比較するには、テスト スクリプトを記述して測定を行う必要があります。しかし、なぜあなたは気にしますか?目的が異なるため、別のものに置き換えることはできません。

経由で開いたファイルを処理する最良の方法は何urllib.urlopen()ですか? 行ごとに処理する方が速いですか?または、一連の行(〜50)をリストにロードしてから、リストを処理しますか?

ボトルネックはネットワーク速度なので、データを取得したらすぐに処理することをお勧めします。このようにして、オペレーティング システムは「バックグラウンドで」より多くの着信データをキャッシュできます。

行を処理する前に行をリストにキャッシュしても意味がありません。あなたのプログラムは、すでに何か役に立つことをしている間に、十分なデータが到着するのを待っているだけです。

于 2011-08-26T05:35:12.907 に答える