温馨提示×

温馨提示×

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

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

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

发布时间:2021-09-13 18:21:06 阅读:311 作者:小新 栏目:大数据
Python开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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

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

import requestsfrom time import timeurl_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_codestart = 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 requestsfrom concurrent.futures import ThreadPoolExecutor, as_completedfrom time import timeurl_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_codestart = 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代码”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

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

原文链接:https://my.oschina.net/u/3358983/blog/4349055

AI

开发者交流群×