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

b_a*_*ies 1 python python-asyncio

我刚刚开始尝试 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()
Run Code Online (Sandbox Code Playgroud)

如果我比较它而不对其进行异步编码:

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()
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Ted*_*ide 6

你在这里没有做错任何事。然而你对 python 中异步的理解是有缺陷的。

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

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

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

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