我应该在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,这意味着我需要做这个检查每个文件,因为我不能得到一个文件夹列表。当然,这是有区别的。
-
根据您的微基准测试,每次调用的额外开销(当目录已经存在时)是6微秒。如果你这样做1000次,它仍然比人类能感知到的要快。如果代码中的热路径创建的目录可能已经存在,那就有问题了;如果不是热路径,则开销与无关。在您的示例中,首先从zip文件中提取/解压缩文件所花费的工作量应该超过最简单代码(纯
os.makedirs(file_path, exist_ok=True)
)的任何开销。这根本不值得担心。 -
这是没有更多的可读性,因为它取代了一个文档,相当知名的API调用的东西,显然是内部的,可能(或可能不)做我所期望的。如果我看到
os.makedirs(file_path, exist_ok=True)
,我知道确切地它做什么,因为我以前在多个项目中使用过该API。如果我看到mkdirs(file_path)
I:。我能猜到它的意思(我是对的),但是
b。如果不查找
mkdirs
的定义,就不能相信它是正确的(首先,我不知道是否应该处理/忽略已经存在的目录的情况),并且c。我几乎肯定会去检查一下,因为像这样重新实现现有的功能是一种代码气味,我想知道为什么有人不直接用
os.makedirs
做这件事。
TL;DR:你正在进行过早的优化。为每个调用编写一个新的包装器来节省少量处理器时间是不值得的,并且会使代码的可维护性降低。只要直接使用API,直到分析证明微优化在实际代码中是重要的。