我应该在os.makedirs之前使用os.path.exists吗?



我应该在os.path.exists之前使用os.path吗?makedirs with exist_ok=True或not?
如果我没有权限访问那个文件夹也没关系。
从我的测试来看,首先检查文件路径似乎要快3倍,这使我的代码更好读。还是我错过了什么?

import timeit
import os
def mkdirs(file_path):
if not os.path.exists(file_path):
os.makedirs(file_path, exist_ok = True)
file_path = "/Users/wannes/Downloads/untitled folder"
print("#0", timeit.timeit('''mkdirs(file_path)''', globals=globals(), number=100000))
print("#1", timeit.timeit('''os.makedirs(file_path, exist_ok = True)''', globals=globals(), number=100000))
#0 0.28453361399806454
#1 0.8769928680012526

用于提取&转换文件从zip,这意味着我需要做这个检查每个文件,因为我不能得到一个文件夹列表。当然,这是有区别的。

  1. 根据您的微基准测试,每次调用的额外开销(当目录已经存在时)是6秒。如果你这样做1000次,它仍然比人类能感知到的要快。如果代码中的热路径创建的目录可能已经存在,那就有问题了;如果不是热路径,则开销与无关。在您的示例中,首先从zip文件中提取/解压缩文件所花费的工作量应该超过最简单代码(纯os.makedirs(file_path, exist_ok=True))的任何开销。这根本不值得担心。

  2. 这是没有更多的可读性,因为它取代了一个文档,相当知名的API调用的东西,显然是内部的,可能(或可能不)做我所期望的。如果我看到os.makedirs(file_path, exist_ok=True),我知道确切地它做什么,因为我以前在多个项目中使用过该API。如果我看到mkdirs(file_path)I:

    。我能猜到它的意思(我是对的),但是

    b。如果不查找mkdirs的定义,就不能相信它是正确的(首先,我不知道是否应该处理/忽略已经存在的目录的情况),并且

    c。我几乎肯定会去检查一下,因为像这样重新实现现有的功能是一种代码气味,我想知道为什么有人不直接用os.makedirs做这件事。

TL;DR:你正在进行过早的优化。为每个调用编写一个新的包装器来节省少量处理器时间是不值得的,并且会使代码的可维护性降低。只要直接使用API,直到分析证明微优化在实际代码中是重要的。

最新更新