Я создаю следующий тест для проверки производительности при выполнении синхронного кода в асинхронной функции.
В return_random
функция может быть чем-то вроде записи журнала, дампа или загрузки json, проверки даты ввода-вывода, которая вызываетдругие функции ... и т. д.
Переменные count_sync и count_async, используемые для пропуска служебных данных при открытии и закрытии цикла событий.просто вычислите время внутри функции.
Эта часть кода просто вызывает синхронный подсчет раз.
import timeit
from time import time
from random import random
count = 100
run_numbers = 100000
count_sync = 0
def return_random():
return random()
def test():
global count_sync
start = time()
for _ in range(count):
return_random()
count_sync += time() - start
return
total_sunc = timeit.timeit('test()', globals=globals(),
number=run_numbers))
Тот же код, но теперь return_random
является асинхронной функцией:
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
count_async = 0
async def return_random_async():
return random()
async def test_async():
global count_async
start = time()
for _ in range(count):
await return_random_async()
count_async += time() - start
return
total_sunc = timeit.timeit('asyncio.run(test_async())', globals=globals(), number=run_numbers)
После выполнения кода с разными номерами функции вызова и счетчиком времени его выполнения получаются следующие результаты:
RUNNING run_numbers: 1000. CALL FUNCTIONS count: 1000
total sync: 0.12023316
total Async: 0.48369559500000003
inside def sync 0.11995530128479004
inside def Async:0.24073457717895508
RUNNING run_numbers: 100000. CALL FUNCTIONS count: 100
total sync: 1.422697458
total Async: 25.452165134999998 (!!!)
inside def sync: 1.3965537548065186
inside def Async: 2.8397130966186523
Все время выполняется с синхронной функцией быстрее, чем в 2 раза.
Значит ли это, что синхронный код лучше работает с не асинхронной функцией?И желательно не использовать много асинхронных функций?