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

王林
Freigeben: 2023-04-14 21:19:01
nach vorne
2094 Leute haben es durchsucht

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:51cto.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage