ホームページ >バックエンド開発 >Python チュートリアル >Python は大きなファイルをダウンロードしますが、どの方法が速いですか?
普段はリクエストライブラリを使ってダウンロードしているのですが、このライブラリがとても便利です。
次のストリーミング コードを使用すると、ダウンロードしたファイルのサイズに関係なく、Python のメモリ使用量は増加しません:
def download_file(url): local_filename = url.split('/')[-1] # 注意传入参数 stream=True with requests.get(url, stream=True) as r: r.raise_for_status() with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) return local_filename
チャンク エンコードが必要な場合の場合、chunk_size パラメーターは渡されず、if 判定が行われる必要があります。
def download_file(url): local_filename = url.split('/')[-1] # 注意传入参数 stream=True with requests.get(url, stream=True) as r: r.raise_for_status() with open(local_filename, 'w') as f: for chunk in r.iter_content(): if chunk: f.write(chunk.decode("utf-8")) return local_filename
iter_content[1] 関数自体もデコードできます。パラメータ decode_unicode = True を渡すだけです。さらに、公式アカウントのトップ Python 背景を検索し、「Advanced」と返信すると、サプライズのギフトパッケージがプレゼントされます。
iter_content を使用して返されるバイト数は正確には chunk_size ではないことに注意してください。これは通常より大きく、反復ごとに変化すると予想される乱数です。
Response.raw[2] および shutil.copyfileobj[3]# を使用します##
import requests import shutil def download_file(url): local_filename = url.split('/')[-1] with requests.get(url, stream=True) as r: with open(local_filename, 'wb') as f: shutil.copyfileobj(r.raw, f) return local_filenameこれにより、メモリをあまり使用せずにファイルがディスクにストリーミングされ、コードがより単純になります。 注: ドキュメントによると、Response.raw はデコードされないため、必要に応じて r.raw.read メソッドを手動で置き換えることができます。
response.raw.read = functools.partial(response.raw.read, decode_content=True)Speed方法 2のほうが速いです。方法 1 が 2 ~ 3 MB/秒の場合、方法 2 は 40 MB/秒近くに達する可能性があります。 参考資料
[1]iter_content: https://requests.readthedocs.io/en/latest/api/#requests.Response.iter_content
#[2]Response.raw: https://requests.readthedocs.io/en/latest/api/#requests.Response.raw #[3]
shutil.copyfileobj:https://docs.python.org/3/library/shutil.html#shutil.copyfileobj
以上がPython は大きなファイルをダウンロードしますが、どの方法が速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。