Python API上的For循环

Python API上的For循环,python,multithreading,for-loop,Python,Multithreading,For Loop,我在一个名为“y”的列表中有一个大约28K个数字的列表,我正在API上运行for循环来发送消息,但这需要很多时间(确切地说,每次调用1.2797秒) 代码: 如何减少这方面的时间?异步或多线程是优化代码的两种可能的解决方案,它们基本上都是这样做的: 螺纹 import timeit 导入线程 导入时间 y=列表(范围(50)) def post_数据(服务器、数据、睡眠时间=1.5): 时间。睡眠(睡眠时间) #request.post(服务器,数据=数据) start=timeit.defau

我在一个名为“y”的列表中有一个大约28K个数字的列表,我正在API上运行for循环来发送消息,但这需要很多时间(确切地说,每次调用1.2797秒)

代码:


如何减少这方面的时间?

异步或多线程是优化代码的两种可能的解决方案,它们基本上都是这样做的:

螺纹
import timeit
导入线程
导入时间
y=列表(范围(50))
def post_数据(服务器、数据、睡眠时间=1.5):
时间。睡眠(睡眠时间)
#request.post(服务器,数据=数据)
start=timeit.default\u timer()
服务器https://xxxx:xx@api.xxx.com/v1/Accounts/xxx/Sms/send'
线程=[]
对于y中的i:
#如果您不需要等待线程,请不要在线程完成后将其保存在内存中,而是这样做
#threading.Thread(target,args.start())
#相反。如果您想发送大量消息,这一点尤为重要
threads.append(threading.Thread(target=post_数据,
args=(服务器,{'From':'XXXX','To':str(i),'Body':'ABC}))
线程[-1]。开始()
对于线程中的线程:
#如果您想等待并发帖子的完成,则可以选择此选项
thread.join()
stop=timeit.default\u timer()
打印('时间:',停止-开始)
异步

import timeit
导入异步
从concurrent.futures导入ThreadPoolExecutor
y=列表(范围(50)
_执行器=线程池执行器(len(y))
loop=asyncio.get\u event\u loop()
def post_数据(服务器、数据、睡眠时间=1.5):
时间。睡眠(睡眠时间)
#request.post(服务器,数据=数据)
async def post_data_async(服务器,数据):
返回等待循环。在执行器中运行(执行器,lambda:post数据(服务器,数据))
异步def运行(y,服务器):
return wait asyncio.gather(*[post_data_async(server,{'From':'XXXX','To':str(i),'Body':'ABC})
对于i(在y中])
start=timeit.default\u timer()
服务器https://xxxx:xx@api.xxx.com/v1/Accounts/xxx/Sms/send'
循环。运行_直到_完成(运行(y,服务器))
stop=timeit.default\u timer()
打印('时间:',停止-开始)
当使用不支持asyncio但可以从并发性中获益的API时,就像您的用例一样,我倾向于使用线程,因为它更易于阅读IMHO。如果您的API/库确实支持asyncio,那就试试吧!太棒了


在我的机器上,当执行50个
time.sleep(1.5)实例时,异步IO解决方案的运行时间为1.515秒,而线程化解决方案大约需要1.509秒

如果API接受许多请求,你可以一次发送所有请求。你正在对所有请求进行计时,而不仅仅是一个请求。@Guy我对一个请求进行计时,得到了1.27秒,后来将其更改为发布问题高延迟请求正是
async
代码存在的目的。看看异步框架,例如
asyncio
<代码>三重奏或
古玩
import timeit

start = timeit.default_timer()

for i in y:
    data = {'From': 'XXXX', 'To': str(i),
            'Body': "ABC ABC" }
    requests.post('https://xxxx:xx@api.xxx.com/v1/Accounts/xxx/Sms/send',data=data)

stop = timeit.default_timer()
print('Time: ', stop - start)