Python requests.get处理图像的速度很慢

Python 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

这将从Github下载20个图像&运行大约需要57秒。 当我在另一台电脑上用不同的互联网连接运行这个程序时,我得到了相同的结果 有没有办法加快速度

图像大小约为1 MB

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的建议和灵感。