为什么python脚本的异步版本不比同步版本快?

2024-04-25 04:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始在python中试用asyncio库。 我的目的是加速我的代码,但是对于我的第一个脚本来说,没有什么比不使用asyncio更好的了

from yahoo_fin import stock_info as si
from yahoo_fin.stock_info import *
import time
import asyncio

async def price(stock):

    prijs = str(si.get_live_price(stock))
    await asyncio.sleep(0.001)
    print(prijs)


def main():
    loop = asyncio.get_event_loop()
    t0 = time.time()
    task =  asyncio.gather(
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe')

    )
    loop.run_until_complete(task)

    t1 = time.time()
    print("took %.2f ms" % (1000*(t1-t0)))

if __name__ == '__main__':
    main()

如果我在不进行异步编码的情况下对其进行比较:

from yahoo_fin import stock_info as si
from yahoo_fin.stock_info import *
import time
import asyncio

def price(stock):
    prijs = str(si.get_live_price(stock))
    print(prijs)


def main():

        t0 = time.time()

        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe')



        t1 = time.time()
        print("took %.2f ms" % (1000*(t1-t0)))


if __name__ == '__main__':
    main()

我认为异步版本可以同时运行所有price()调用,从而减少执行程序的时间?我做错什么了吗

谢谢


Tags: fromimportinfoasynciotimemaindefstock
1条回答
网友
1楼 · 发布于 2024-04-25 04:36:04

你没有做错什么。然而,您对python中异步的理解是有缺陷的

由于GIL,Python不能同时做两件事。这是不可能的。您可以假装使用python线程和异步执行多项任务,但这不是真正的多任务处理。如果您想要真正的多任务处理,您需要使用python中的multiprocessing模块,但这超出了这个问题的范围

因此,基本上在异步中,当您等待一个函数时,您会告诉python这个调用正在做一些需要时间才能返回的事情,然而,等待意味着python没有计算它实际上正在等待的任何事情,例如,执行IO绑定的任务,而不是CPU任务。这里的程序100%受CPU限制,因为您不需要等待磁盘查找内容,也不需要使用异步函数通过网络发送/接收数据

你的程序是这样说的。我将调用si.get_live_price(stock)一个非异步函数并等待(而不是等待)结果。在此之后,我将异步睡眠0.001,以便其他人可以工作,但在0.001之后,没有其他人可以工作,因为我想再次控制,以便我可以通过打印到控制台来完成。一旦打印出来,python现在将专注于下一个任务,该任务将重复上述步骤

这是一个需要一些时间才能完全理解的主题,但我的建议是查找python中并发性和并行性之间的区别

相关问题 更多 >