ホームページ  >  記事  >  バックエンド開発  >  Python は大きなファイルをダウンロードしますが、どの方法が速いですか?

Python は大きなファイルをダウンロードしますが、どの方法が速いですか?

王林
王林転載
2023-04-14 21:19:012083ブラウズ

Python は大きなファイルをダウンロードしますが、どの方法が速いですか?

普段はリクエストライブラリを使ってダウンロードしているのですが、このライブラリがとても便利です。

方法 1

次のストリーミング コードを使用すると、ダウンロードしたファイルのサイズに関係なく、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 ではないことに注意してください。これは通常より大きく、反復ごとに変化すると予想される乱数です。

方法 2

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 サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。