我创建以下测试来检查异步函数中运行同步代码的性能。
在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倍。
这是否意味着在没有异步功能的情况下可以更好地运行同步代码? 并且最好不要使用很多异步功能?
答案 0 :(得分:1)
仅在真正需要时才需要使用异步功能。示例:诸如aiohttp
之类的异步http库,针对MongoDB的诸如motor_asyncio
之类的异步驱动程序,等等。在其他情况下,最好使用不具有异步功能的同步代码,因为它们具有您不需要的开销拥有。