我编写的程序在一个范围内循环并找到素数和回文数。作为学习异步的一部分,我尝试使用异步重新构造它。但是结果不是good.Here异步代码花费的时间比同步代码长得多。
同步码
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)结果:
999727999
999686999
999676999
999565999
999454999
999434999
999272999
999212999
999070999
998979899
998939899
998898899
998757899
998666899
998565899
998333899
998282899
998202899
998171899
998121899
took --> 0.6525201797485352异步代码
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)结果:
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秒即可完成。
有人能解释一下为什么会这样吗?
发布于 2020-08-14 12:18:52
您的用例似乎只是CPU密集型的,不需要IO工作。
python中的异步主要用于继续使用CPU,而IO操作正在运行(http请求、文件写入)。
我想你可能和线程混淆了。Python一次只能使用一个CPU核心,异步作业由同一个核心排队并执行。这意味着在您的示例中,您将不会通过使用异步获得任何东西,但是可能会增加一些开销,从而降低执行时间。
https://stackoverflow.com/questions/63412517
复制相似问题