Python requests.get处理图像的速度很慢
这将从Github下载20个图像&运行大约需要57秒。 当我在另一台电脑上用不同的互联网连接运行这个程序时,我得到了相同的结果 有没有办法加快速度 图像大小约为1 MBPython requests.get处理图像的速度很慢,python,Python,这将从Github下载20个图像&运行大约需要57秒。 当我在另一台电脑上用不同的互联网连接运行这个程序时,我得到了相同的结果 有没有办法加快速度 图像大小约为1 MB def loadImage(url, Finger): response = requests.get(url) image = np.asarray(bytearray(response.content), dtype="uint8") image = cv2.imdecode(im
def loadImage(url, Finger):
response = requests.get(url)
image = np.asarray(bytearray(response.content), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_GRAYSCALE)
if Finger:
image = cv2.resize(image,(320, 550))
else:
image = cv2.resize(image,(127,127))
return image
class Finerprint:
def __init__(self):
self.fingerImg = []
self.fingerSol = [None] * 4
fingerprints = [None] * 4
def initFingerprints():
# Initialize the four fingerprints
for i in range(4):
fingerprints[i] = Finerprint()
fingerprints[i].fingersol = []
for i in range(4):
print(f"Loading F{i}")
fingerprints[i].fingerImg = loadImage(f"https://raw.githubusercontent.com/HazemMohamed98/GTA-Online-Fingerprint/Images/F{i + 1}.jpg", True)
for j in range(4):
print(f"Loading F{i}S{j}")
fingerprints[i].fingerSol[j] = loadImage(f"https://raw.githubusercontent.com/HazemMohamed98/GTA-Online-Fingerprint/Images/F{i + 1}S{j + 1}.jpg", False)
initFingerprints()
@Brendan Abel的建议启发了我在这方面尝试一些
多处理
。我想到了这个:
#!/usr/bin/python3
import cv2
from multiprocessing.dummy import Pool as ThreadPool
import numpy as np
import requests
from time import time
f_count = 4
s_count = 4
def loadImage(response, Finger):
image = np.asarray(bytearray(response.content), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_GRAYSCALE)
if Finger:
image = cv2.resize(image,(320, 550))
else:
image = cv2.resize(image,(127,127))
return image
def build_URL(f=0, s=None):
url = "https://raw.githubusercontent.com/HazemMohamed98/GTA-Online-Fingerprint/Images/"
insert = f'F{f}' + (f'S{s}' if s is not None else '')
return f'{url}{insert}.jpg'
def fetch_all(rf, rs):
urls = [build_URL(i+1) for i in range(rf)] + [build_URL(i+1,j+1) for i in range(rf) for j in range(rs)]
t = time()
with ThreadPool(20) as pool:
responses = list(pool.map(requests.get, urls))
t = time() - t
print(f'Parallel fetch time: {t} sec')
return responses
class Fingerprint:
def __init__(self):
self.fingerImg = []
self.fingerSol = [None] * s_count
fingerprints = [None] * f_count
def initFingerprints():
# Acquire all URLs in parallel
responses = fetch_all(f_count, s_count)
# Initialize the four fingerprints
ndx = f_count
for i in range(f_count):
fingerprints[i] = Fingerprint()
for i in range(f_count):
print(f"{i} Loading image from {responses[i].url}")
fingerprints[i].fingerImg = loadImage(responses[i], True)
for j in range(s_count):
print(f"{i} {j} {ndx} Loading image from {responses[ndx].url}")
fingerprints[i].fingerSol[j] = loadImage(responses[ndx], False)
ndx += 1
return fingerprints
请注意,我已经在打印循环索引的部分中留下了内容,在获取操作之后,url被分配给了什么。我没有实际的方法来检查cv2的结果,我只是想看看使用多重处理的结果是什么
在我的测试中,并行获取所有20个URL的实际时间在0.3到0.6秒之间。这比连续6秒的结果有了很大的改进
这对我来说很有教育意义,我希望它能对OP有所帮助 您可以使用多处理一次发送所有图像下载请求。在multiprocessing.dummy库中查找Pool函数。Line
fingerprints[i],fingersol=[]
需要是fingerprints[i]。fingersol=[None]*4
,否则在寻址fingerprints[i]时会得到索引超出范围。fingersol[j]=…
。我在一个300 mb/s的连接上运行了这个,它运行了5.81秒。这意味着互联网的连通性。因此@PL200建议将多处理解决方案作为加快处理速度的目标。请查看多处理、线程或asyc。这个想法是,你想并行下载它们,而不是串行下载,这样你就可以饱和你的互联网连接。是的,多处理似乎已经解决了这个问题。谢谢,这是纯金的。对我来说,运行时间变成了12秒,而不是原来的57秒。我猜我的互联网连接仍然是一个瓶颈。我可能会让照片在第一次运行后存储在本地,这样就不需要每次运行都重新下载。很高兴这有帮助。(我知道我在这里完全被互联网速度宠坏了…)。感谢@Brendan Abel的建议和灵感。