在API上进行循环

拉胡尔·沙玛(Rahul Sharma)

我在名为“ y的列表中有大约28000个数字的列表,并且正在API上运行for循环以发送消息,但这需要花费大量时间(准确地说是每次调用1.2797秒)

码:

import timeit

start = timeit.default_timer()

for i in y:
    data = {'From': 'XXXX', 'To': str(i),
            'Body': "ABC ABC" }
    requests.post('https://xxxx:[email protected]/v1/Accounts/xxx/Sms/send',data=data)

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

我该如何减少时间?

贾克

Asyncio或Multithreading是优化代码的两种可能的解决方案,并且两者基本上都在后台执行相同的操作:

螺纹的

import timeit
import threading
import time

y = list(range(50))


def post_data(server, data, sleep_time=1.5):
    time.sleep(sleep_time)
    # request.post(server, data=data)


start = timeit.default_timer()

server = 'https://xxxx:[email protected]/v1/Accounts/xxx/Sms/send'

threads = []
for i in y:
    # if you don't need to wait for your threads don't hold them in memory after they are done and instead do
    # threading.Thread(target, args).start()
    # instead. Especially important if you want to send a large number of messages
    threads.append(threading.Thread(target=post_data,
                            args=(server, {'From': 'XXXX', 'To': str(i), 'Body': "ABC ABC"}))
    threads[-1].start()

for thread in threads:
    # optional if you want to wait for completion of the concurrent posts
    thread.join()

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

异步

参考这个答案

import timeit
import asyncio
from concurrent.futures import ThreadPoolExecutor

y =  list(range(50)
_executor = ThreadPoolExecutor(len(y))

loop = asyncio.get_event_loop()

def post_data(server, data, sleep_time=1.5):
    time.sleep(sleep_time)
    # request.post(server, data=data)

async def post_data_async(server, data):
    return await loop.run_in_executor(_executor, lambda: post_data(server, data))


async def run(y, server):
    return await asyncio.gather(*[post_data_async(server, {'From': 'XXXX', 'To': str(i), 'Body': "ABC ABC"})
                                  for i in y])


start = timeit.default_timer()

server = 'https://xxxx:[email protected]/v1/Accounts/xxx/Sms/send'

loop.run_until_complete(run(y, server))

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

当使用不支持异步但可以从并发中获利的API时(如您的用例),我倾向于使用线程,因为它更易于理解IMHO。如果您的API /库确实支持asyncio,那就去吧!这很棒!

在我的包含50个元素的列表的机器上,asyncio解决方案在运行时运行1.515秒,而线程解决方案在执行50个实例时需要大约1.509秒time.sleep(1.5)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Python上进行循环

在熊猫上进行比较的循环

在不存在的文件上进行循环

使用ffmpeg在叠加图像上进行左右循环循环

在新的OneDrive API上进行复制操作

为什么在foreach方法上进行并发修改而不在for循环上进行

Hadoop-使用XPath在XML节点上进行PIG循环

如何在react-select上进行for循环?

如何在数组上进行无限循环

如何在Go中的模板(而不是范围)上进行循环?

对于 k, v 循环,在多级地图上进行过滤

在切片上进行循环索引以获取范围

使用异步数据在Node.js上进行While循环

优化嵌套循环以在R中的矩阵上进行计算

无法在Excel VBA上进行循环并打印结果

在 Nightwatch 上进行同步循环的更好方法是什么?

在基于Spark Dataframe的API中的多个列上进行过滤

如何在值列表上进行api请求调用?

使用Ajax在外部Rest API上进行呼叫

是否可以在github API上进行批处理请求?

使用cheerio(JQuery API)在Node JS上进行解析

在所有列上进行迭代或循环(类似于对变量进行计数,求和或减去的函数)

在2D数组上进行迭代时,为什么循环顺序会影响性能?

为什么在此循环上进行的迭代未在openpyxl中添加单元格?

在地图上进行SASS循环,获取下一个迭代

尝试在清单上进行foreach循环时获取System.InvalidOperationException吗?

在具有两个隐式循环的数组上进行迭代

我正在RequireJS网站上进行循环引用的说明,但是它不起作用

for循环中的AJAX问题:如何在数组的每个元素上进行Ajax调用?