首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步:异步程序比同步程序慢

异步:异步程序比同步程序慢
EN

Stack Overflow用户
提问于 2020-08-14 12:10:34
回答 1查看 300关注 0票数 0

我编写的程序在一个范围内循环并找到素数和回文数。作为学习异步的一部分,我尝试使用异步重新构造它。但是结果不是good.Here异步代码花费的时间比同步代码长得多。

同步码

代码语言:javascript
复制
import math
import time


def prime(n):
    limit=int(math.sqrt(n))
    for j in range(2,limit):
        if(n%j==0):
            return 0
    return 1


def pallindrome(n):
    n=str(n)
    m=n[::-1]
    if(m==n):
        return 1
    return  0


a, b, c = 999999999, 9999999, 0
start = time.time()

for i in range(a, b, -1): 
    if(pallindrome(i)):  
        if(prime(i)):
            c+=1
            print(i)
    if(c==20):
        break
print("took --> ", time.time()-start)

结果:

代码语言:javascript
复制
999727999
999686999
999676999
999565999
999454999
999434999
999272999
999212999
999070999
998979899
998939899
998898899
998757899
998666899
998565899
998333899
998282899
998202899
998171899
998121899
took -->  0.6525201797485352

异步代码

代码语言:javascript
复制
import math , time, asyncio

async def is_prime(n):
    limit= int(math.sqrt(n))
    for j in range(2,limit):
        await asyncio.sleep(0)
        if(n%j==0):
            return 0
    return 1

async def is_pallindrome(n):
    await asyncio.sleep(0)
    n=str(n)
    m=n[::-1]
    if(m==n):
        return 1
    return  0

async def waiting(start):
    while True:
        print("processing --> time took {:.2f} --> still running".format(time.time()-start))
        await asyncio.sleep(2)
    
async def main():
    a, b, c = 999999999, 9999999, 0
    start = time.time()
    for i in range(a, b , -1):
        await asyncio.sleep(0)
        if(await is_pallindrome(i)):  
            if(await is_prime(i)):
                c+=1
                print(i)
        if(c==20):
            break
    print(f"Found {c} results in {time.time()-start}s exiting now")

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.create_task(waiting(time.time()))
    future = asyncio.ensure_future(main())
    loop.run_until_complete(future)

结果:

代码语言:javascript
复制
999727999
999686999
999676999
999565999
999454999
999434999
999272999
999212999
999070999
998979899
998939899
998898899
998757899
998666899
998565899
998333899
998282899
998202899
998171899
998121899
Found 20 results in 18.48567509651184s exiting now

另一件有趣的事情是,传递loop.set_debug(True)并将代码运行到103秒即可完成。

有人能解释一下为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2020-08-14 12:18:52

您的用例似乎只是CPU密集型的,不需要IO工作。

python中的异步主要用于继续使用CPU,而IO操作正在运行(http请求、文件写入)。

我想你可能和线程混淆了。Python一次只能使用一个CPU核心,异步作业由同一个核心排队并执行。这意味着在您的示例中,您将不会通过使用异步获得任何东西,但是可能会增加一些开销,从而降低执行时间。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63412517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档