温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用多线程加速Python代码

发布时间:2021-09-13 18:21:06 来源:亿速云 阅读:235 作者:小新 栏目:大数据

这篇文章主要介绍如何使用多线程加速Python代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

很多时候,我们大部分使用Python编写代码,python因为其简洁,在一些小功能的开发确实快一些,当我们的代码执行远程请求或读取多个文件或对某些数据进行处理。在很多情况下下,我们大家都是利用循环去读取,这种方法要花很长时间才能完成执行。

import requests
from time import time

url_list = [
   "https://via.placeholder.com/400",
   "https://via.placeholder.com/410",
   "https://via.placeholder.com/420",
   "https://via.placeholder.com/430",
   "https://via.placeholder.com/440",
   "https://via.placeholder.com/450",
   "https://via.placeholder.com/460",
   "https://via.placeholder.com/470",
   "https://via.placeholder.com/480",
   "https://via.placeholder.com/490",
   "https://via.placeholder.com/500",
   "https://via.placeholder.com/510",
   "https://via.placeholder.com/520",
   "https://via.placeholder.com/530",
]

def download_file(url):
   html = requests.get(url, stream=True)
   return html.status_code

start = time()

for url in url_list:
   print(download_file(url))

print(f'Time taken: {time() - start}')

输出:

Time taken: 4.128157138824463

        这是很明显的案例,这段代码将依次打开每个URL,等待其加载,打印其状态代码,然后再移至下一个URL。如果用上面的写法将十分耗时,这种代码非常适合用于多线程。

        利用多线程,您可以以非常低的开销同时执行多个任务。接下来我们去试一下。

        我们使用 current.futures 库的ThreadPoolExecutor实现多线程。然后我们写一下多线程代码,并解释原理。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from time import time

url_list = [
   "https://via.placeholder.com/400",
   "https://via.placeholder.com/410",
   "https://via.placeholder.com/420",
   "https://via.placeholder.com/430",
   "https://via.placeholder.com/440",
   "https://via.placeholder.com/450",
   "https://via.placeholder.com/460",
   "https://via.placeholder.com/470",
   "https://via.placeholder.com/480",
   "https://via.placeholder.com/490",
   "https://via.placeholder.com/500",
   "https://via.placeholder.com/510",
   "https://via.placeholder.com/520",
   "https://via.placeholder.com/530",
]

def download_file(url):
   html = requests.get(url, stream=True)
   return html.status_code

start = time()

processes = []
with ThreadPoolExecutor(max_workers=10) as executor:
   for url in url_list:
       processes.append(executor.submit(download_file, url))

for task in as_completed(processes):
   print(task.result())


print(f'Time taken: {time() - start}')

输出:

Time taken: 0.4583399295806885

        代码处理速度增加了9倍!如果有更多的URL,则性能差异应该更明显。

        为什么多线程速度那么快。当我们在调用executor.submit时,我们往线程池添加一个新的任务。

        那到底是怎么回事?调用时,executor.submit我们正在向线程池添加新任务。连接其存储起来,之后我们将便利调用任务,并打印结果。

as_completed方法是用来在一个任务完成后,立即从任务列表拿出一个任务去执行。只有已经执行完成或者被取消,任务才会标记为完成状态。我们也可以向其传递一个超时参数,如果任务花费的时间超过该时间段,则即使也会as_completed切换任务。

以上是“如何使用多线程加速Python代码”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI