한 줄에 python3 코드 속도를 높이는 방법

이 짧은 기사에서는 asnycio를 사용하여 코드 속도를 높일 것입니다. 우리는 modutils 라이브러리의 함수를 사용하여 코드에 asnyc를 추가하는 효율성과 용이성을 보여줍니다.


다음은 속도를 높일 수 있는 예제 코드입니다. 이것은 asyncio의 요점을 증명하기 위한 기본 예제입니다. Google에 요청을 보내고 응답을 반환합니다. 우리는 이것을 32번 할 것이고 얼마나 걸리는지 볼 것입니다.

import requests

from time import time

def task(url):
    """ a simple task to return the response of a given url

    :param url: {str} -- url to send requests

    :return: Response object from requests
    """
    return requests.get(url, headers={'User-Agent':'Chrome; Python'})

# timing execution
start = time()
# create list to store Response objects
responses = []
for _ in range(0, 32):
    # add Response to list
    responses.append(task('https://www.google.com'))
print(f'{time()-start} to get all responses')

산출:

2.498640775680542 to get all responses


이제 asyncio를 사용하여 한 번에 16개의 응답을 검색하도록 이 예제를 업데이트할 것입니다. 이것은 16으로 설정한 max_async_pool 변수에 의해 결정됩니다. 이것은 원하는 속도와 시스템 리소스에 따라 증가하거나 감소할 수 있습니다.

import requests

from time import time
from modutils import aioloop


def task(url: str):
    """ a simple task to return the response of a given url

    :param url: {str} -- url to send requests

    :return: Response object from requests
    """
    return requests.get(url, headers={'User-Agent': 'Chrome; Python'})

# timing execution
start = time()
# create a list of arguments for the task function
args = [['https://www.google.com'] for _ in range(0, 32)]
# sending 16 requests at one time by setting max_async_pool to 16
# responses is a list of Response objects
responses = aioloop(task, args, max_async_pool=16)
print(f'{time()-start} to get all responses')

산출:

0.2680017948150635 to get all responses

aioloopmodutils 함수를 사용하여 코드 속도를 높이고 2초가 걸리는 것을 거의 즉시 만들 수 있었습니다.

참고: aioloop 함수의 경우 각 내부 항목을 주어진 함수로 압축 해제하는 args 목록을 만들었습니다. 인수 목록에 사전을 사용하여 명명된 인수를 추가할 수도 있습니다. 아래 예:

import requests

from time import time
from modutils import aioloop


def task(url: str, params: dict=None):
    """ a simple task to return the response of a given url

    :param url: {str} -- url to send requests
    :param params: {dict} -- optional named argument for requests parameters

    :return: Response object from requests
    """
    return requests.get(url, headers={'User-Agent': 'Chrome; Python'}, params=params)

# timing execution
start = time()
# create a list of arguments for the task function
args = [['https://www.google.com', {'params':{'q':'testing'}}] for _ in range(0, 32)]
# sending 16 requests at one time by setting max_async_pool to 16
# responses is a list of Response objects
responses = aioloop(task, args, max_async_pool=16)
print(f'{time()-start} to get all responses')

modutilshere에 대해 자세히 알아보십시오.

좋은 웹페이지 즐겨찾기