Heim >Backend-Entwicklung >Python-Tutorial >Python lädt große Dateien herunter. Welche Methode ist schneller?

Python lädt große Dateien herunter. Welche Methode ist schneller?

王林
王林nach vorne
2023-04-14 21:19:012134Durchsuche

Python lädt große Dateien herunter. Welche Methode ist schneller?

Normalerweise verwenden wir zum Herunterladen die Anforderungsbibliothek. Diese Bibliothek ist sehr praktisch.

Methode 1

Verwenden Sie den folgenden Streaming-Code. Die Python-Speichernutzung erhöht sich unabhängig von der Größe der heruntergeladenen Datei nicht:

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

Wenn Sie eine Chunk-Codierung benötigen, sollten Sie den Parameter chunk_size nicht übergeben, und sollten dies auch tun Es gibt ein Wenn-Urteil.

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] Die Funktion selbst kann auch dekodiert werden, übergeben Sie einfach den Parameter decode_unicode = True. Durchsuchen Sie außerdem den oberen Python-Hintergrund des offiziellen Kontos und antworten Sie mit „Erweitert“, um ein Überraschungsgeschenkpaket zu erhalten.

Bitte beachten Sie, dass die Anzahl der mit iter_content zurückgegebenen Bytes nicht genau chunk_size ist, sondern eine Zufallszahl, die normalerweise größer ist und voraussichtlich bei jeder Iteration variiert.

Methode 2

Verwenden Sie Response.raw[2] und 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

Dadurch wird die Datei auf die Festplatte gestreamt, ohne zu viel Speicher zu verbrauchen, und der Code ist sauberer. Einfach.

Hinweis: Laut Dokumentation wird Response.raw nicht dekodiert, sodass Sie die Methode r.raw.read bei Bedarf manuell ersetzen können.

response.raw.read = functools.partial(response.raw.read, decode_content=True)

Geschwindigkeit

Methode zwei ist schneller. Wenn Methode eins 2–3 MB/s beträgt, kann Methode zwei fast 40 MB/s erreichen.

Referenzen

[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 #shutil.copyfileobj

Das obige ist der detaillierte Inhalt vonPython lädt große Dateien herunter. Welche Methode ist schneller?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen