为 Shutil 添加多线程?!

为 shutil 添加多线程?!

讨论shutil.copytree添加多线程

** 我在 python 上写的讨论:https://discuss.python.org/t/add-multithreading-to-shutil-copytree/62078 **

背景

shutil 是 python 中一个非常有用的模块。你可以在github中找到它:https://github.com/python/cpython/blob/master/lib/shutil.py

shuutil.copytree 是一个将文件夹复制到另一个文件夹的函数。

在这个函数中,调用_copytree函数进行复制。

_copytree 有什么作用?

忽略指定的文件/目录。创建目标目录。在处理符号链接时复制文件或目录。收集并最终提出遇到的错误(例如权限问题)。将源目录的元数据复制到目标目录。

问题

_当文件数量较多或文件大小较大时,copytree速度不是很快

在这里测试:

import osimport shutilos.mkdir('test')os.mkdir('test/source')def bench_mark(func, *args):    import time    start = time.time()    func(*args)    end = time.time()    print(f'{func.__name__} takes {end - start} seconds')    return end - start# write in 3000 filesdef write_in_5000_files():    for i in range(5000):        with open(f'test/source/{i}.txt', 'w') as f:            f.write('hello world' + os.urandom(24).hex())            f.close()bench_mark(write_in_5000_files)def copy():    shutil.copytree('test/source', 'test/destination')bench_mark(copy)

结果是:

write_in_5000_files 需要 4.084963083267212 秒
复制需要 27.12768316268921 秒

我做了什么

我使用多线程来加速复制过程。我将函数重命名为_copytree_single_threaded,添加一个新函数_copytree_multithreaded。这是copytree_multithreaded:

def _copytree_multithreaded(src, dst, symlinks=false, ignore=none, copy_function=shutil.copy2,                            ignore_dangling_symlinks=false, dirs_exist_ok=false, max_workers=4):    """recursively copy a directory tree using multiple threads."""    sys.audit("shutil.copytree", src, dst)    # get the entries to copy    entries = list(os.scandir(src))    # make the pool    with threadpoolexecutor(max_workers=max_workers) as executor:        # submit the tasks        futures = [            executor.submit(_copytree_single_threaded, entries=[entry], src=src, dst=dst,                            symlinks=symlinks, ignore=ignore, copy_function=copy_function,                            ignore_dangling_symlinks=ignore_dangling_symlinks,                            dirs_exist_ok=dirs_exist_ok)            for entry in entries        ]        # wait for the tasks        for future in as_completed(futures):            try:                future.result()            except exception as e:                print(f"failed to copy: {e}")                raise

我添加了一个判断来选择是否使用多线程。

if len(entries) >= 100 or sum(os.path.getsize(entry.path) for entry in entries) >= 100*1024*1024:        # multithreaded version        return _copytree_multithreaded(src, dst, symlinks=symlinks, ignore=ignore,                                        copy_function=copy_function,                                        ignore_dangling_symlinks=ignore_dangling_symlinks,                                        dirs_exist_ok=dirs_exist_ok)else:    # single threaded version    return _copytree_single_threaded(entries=entries, src=src, dst=dst,                                        symlinks=symlinks, ignore=ignore,                                        copy_function=copy_function,                                        ignore_dangling_symlinks=ignore_dangling_symlinks,                                        dirs_exist_ok=dirs_exist_ok)

测试

我在源文件夹中写入了 50000 个文件。基准标记:

def bench_mark(func, *args):    import time    start = time.perf_counter()    func(*args)    end = time.perf_counter()    print(f"{func.__name__} costs {end - start}s")

写在:

import osos.mkdir("test")os.mkdir("test/source")# write in 50000 filesdef write_in_file():    for i in range(50000):         with open(f"test/source/{i}.txt", 'w') as f:             f.write(f"{i}")             f.close()

两个比较:

def copy1():    import shutil    shutil.copytree('test/source', 'test/destination1')def copy2():    import my_shutil    my_shutil.copytree('test/source', 'test/destination2')

“my_shutil”是我修改过的shutil版本。

copy1 花费 173.04780609999943s
copy2 花费 155.81321870000102s

copy2 比 copy1 快很多。你可以跑很多次。

优点和缺点

使用多线程可以加快复制过程。但会增加内存占用。但我们不需要在代码中重写多线程。

结尾

这是我第一次在 python.org 上写讨论。如果有任何问题,请告诉我。谢谢你。

我的github:https://github.com/mengqinyuan
我的开发者:https://dev.to/mengqinyuan

以上就是为 Shutil 添加多线程?!的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:54:56
下一篇 2025年12月13日 12:55:01

相关推荐

  • 模拟 Python 类

    最近,我必须使用 pytest 为 python 模块编写单元测试。该模块包含一个类,其他类在其构造函数中初始化。 像往常一样,我为此类创建了一个固定装置,以便轻松为每个类方法编写测试。此时,当我尝试模拟构造函数中启动的不同类时,我遇到了一些问题。模拟不起作用,这些类的实例仍在创建中。 经过一些研究…

    好文分享 2025年12月13日
    000
  • Python 元组、集合和字典 || #f #daysofMiva 日

    今天是 #100daysofmiva 的第 5 天 – 请参阅 github 项目。 我深入研究了 python 中的三种基本数据结构:元组、集合和字典。这些结构对于有效组织和访问数据至关重要,每个结构都具有独特的特征和用例。这是我所学到的详细报告,包括流程、技术细节和代码示例。 1.元…

    2025年12月13日
    000
  • 由于源冻结期导致 AWS DMS 表失败

    我们正在将AWS DMS与db2连接以迁移数据。在源中,我们有大约 8 小时的冻结期,因此我们将停止并恢复 DMS 服务。 一旦我们恢复 DMS,大多数表将恢复,但由于某些更改,某些表仍将被锁定,从而导致“表错误”状态。此后我们无法恢复表,唯一的选项是重新加载。 我们无法定义牌桌列表或这些牌桌的发布…

    2025年12月13日
    000
  • Python 技巧:将列表推导式与条件逻辑结合使用

    python 中的列表推导式是一种创建列表并允许条件逻辑根据特定条件过滤或修改元素的简洁方法。 这可以带来更干净、更易读的代码。 示例:过滤和修改列表项 # Original list of numbersnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# Use …

    2025年12月13日
    000
  • Python——一种机器语言

    python python 是一种高级解释型编程语言,以其易用性和可读性而闻名。其设计理念强调代码的可读性,使用显着的缩进,帮助开发人员编写清晰简洁的代码。 python 支持多种编程范例,包括过程式编程、面向对象编程和函数式编程。这种多功能性使其适用于广泛的应用,从 web 开发和数据分析到自动化…

    2025年12月13日
    000
  • Python 连接器版本中的新增功能:Microsoft Excel 集成和更新的订阅模型支持

    Devart 是一家为各种数据连接技术和框架提供世界级数据连接解决方​​案的公认供应商,提供了新版本的 Python Connectors 并进行了大量更新。 在此版本中,Devart 推出了新的适用于 Microsoft Excel 的 Python 连接器。它使用户能够对其 Microsoft …

    2025年12月13日
    000
  • 使用 OpenAI Assistants API 创建控制台机器人所需的帮助

    大家好, 我在使用 OpenAI Assistants API 创建控制台机器人时遇到困难,希望得到您的帮助。问题是这样的: 我通过 Playground 创建了一个助手并拥有它的 ID。我现在的目标是创建一个与该助手交互的控制台机器人。助手仅使用指令,不使用任何工具。主要任务是确保机器人根据指令做…

    2025年12月13日
    000
  • CSV – 在 Python 中处理本地和远程文件

    编码员们大家好! 本文介绍了一个开源工具,它能够处理本地和远程 csv 文件、加载和打印信息,然后将列映射到 django 类型。当数据集变大、excel不支持自定义报告或通过数据表进行完整数据操作时,通常需要处理csv文件,并且需要api。 当前的功能列表可以进一步扩展,以将 csv 文件映射到数…

    2025年12月13日
    000
  • 使用 FastAPI 构建 Todo API 的部分:分步指南

    使用 fastapi 构建 todo api:分步指南 代码可以在这里找到:github – jamesbmour/blog_tutorials: 一、简介 在上一篇文章中,我们介绍了fastapi并建立了基本的项目结构。现在,我们将更进一步,构建一个功能性的 todo api。在本教程…

    2025年12月13日
    000
  • Python-Jira 票证管理

    您好,我刚刚发现了 jira lib,我决定对其进行测试,以找到获得最多门票的人。 我的github中的代码:https://github.com/victordalet/jira_python_test 一、安装 你只需要python并安装jira lib。 pip install jira 二 …

    2025年12月13日
    000
  • 如何使用一个 API 创建 AI 聊天机器人来访问多个 LLM

    最初由 liz acosta 发表在 streamlit 博客上 还记得第一次使用人工智能图像生成器有多酷吗?那两千万根手指和噩梦般的吃意大利面的画面不仅仅是有趣,它们在不经意间透露了哎呀!人工智能模型的智能程度与我们一样。和我们一样,他们也很难画手。 人工智能模型很快变得更加复杂,但现在的模型数量…

    2025年12月13日
    000
  • 使用 pip-abandoned 识别废弃的 PyPI 包

    我们通常要避免在应用程序中依赖废弃和弃用的软件包。 pip-abandoned 可以帮助解决这个问题。在某些打包生态系统中,注册表允许您将包标记为已弃用或放弃。例如在 npm 中: 和Packagist: 这还允许包管理器使用此元数据在安装时提供警告: PyPI没有这个概念。注册表不提供任何方法来放…

    2025年12月13日 好文分享
    000
  • 感觉没有动力

    感觉自己像个菜鸟,放弃了几次。 我第一次开始考虑编码是在我还是个孩子的时候,但我选择成为一名社交蝴蝶,现在我已经 26 岁了,尝试了很多次学习编码 python、JS、React、DB 等等,但是最后,我感到不知所措,放弃了。 现在,正因为如此,我感觉自己像个失败的松手,我想解决这个问题。关于如何做…

    2025年12月13日
    000
  • 掌握 Django:从头开始构建安全的用户身份验证 API

    “## 第四天#100daysofMiva 编码挑战赛已经进行四天了。 ??? ? 深入了解 django:从头开始构建安全的用户身份验证 api! 您准备好将您的 Django 技能提升到新水平了吗? ? 在本教程中,我将指导您使用 Django 创建强大的用户身份验证 API。无论您…

    2025年12月13日 好文分享
    000
  • Python 教程 – 简介

    python 是目前最流行的编程语言之一,尤其是随着人工智能技术的兴起。 python 是一种多用途编程语言,用于开发 web 应用程序、后端服务、数据科学和机器学习等许多东西。 设置 这些是使用 python 编码的准备工作: 下载python然后安装。您可以使用任何文本编辑器来编写 python…

    2025年12月13日
    000
  • 每周挑战

    穆罕默德·s·安瓦尔 (mohammad s. anwar) 每周都会发出“每周挑战”,为我们所有人提供了为两周任务提出解决方案的机会。我的解决方案首先用python编写,然后转换为perl。这对我们所有人来说都是练习编码的好方法。 挑战,我的解决方案 任务 1:唯一编号 任务 给你一个整数数组@i…

    2025年12月13日
    000
  • 如何使用 Python 自动下载图像:综合指南

    在当今的数字时代,以编程方式管理和处理图像可以为您节省大量的时间和精力。如果您希望自动化从网络下载图像的过程,那么您来对地方了。在本文中,我们将深入研究一个使用 pexels api(高质量库存照片的流行来源)来完成此操作的 python 脚本。 概述此处提供的 python 脚本允许您根据查询在 …

    2025年12月13日
    000
  • 硒 python 和 docker

    嗨,我展示了如何在 docker 容器中使用 selenium (或 undetected_chromedriver)。 我——dockerfile 我正在使用 docker python 图像并添加 chromdriver 和 chromium 来浏览网站。 第一步是创建requirements.…

    2025年12月13日
    000
  • 矢量视觉:改变您的本地图像搜索

    Vector Vision 是一款桌面应用程序,旨在简化用户搜索和管理本地图像集合的方式,利用技术提供直观、高效的体验,而无需互联网连接。该应用程序采用Python和Qt5作为其核心功能,而ChromaDB则增强了其图像搜索功能。 核心特性和技术见解 Vector Vision 的主要功能之一是其多…

    2025年12月13日
    000
  • 亚马逊产品数据集

    嗨,我在 kaggle 中找到了亚马逊产品的数据集,并决定找到价格和星级之间的关系。 完整代码:https://github.com/victordalet/kaggle_analysis/tree/feat/amazon_products i-准备数据 为此,我使用 sqlalchemy 将 cs…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信