哪个在Python中更快:if或try

您所在的位置:网站首页 python里try的用法 哪个在Python中更快:if或try

哪个在Python中更快:if或try

#哪个在Python中更快:if或try| 来源: 网络整理| 查看: 265

请考虑以下代码:

def readPath(path): cOntent= None if os.path.isfile(path): f = open(path,"rb") cOntent= f.read() f.close() return content

与这一个:

def readPath(path): cOntent= None try: f = open(path,"rb") cOntent= f.read() f.close() except: pass return content

鉴于def被连续调用多次(数百到数千次),主要是使用有效路径(代表文件系统上的实际文件),但有时使用不存在的路径,哪个版本更有效?在打开文件之前检查条件是否比设置try块慢?

1> Antti Haapal..:

通常情况下,回答"取其使用,if或try"答案是EAFP -更容易请求原谅比许可,因此总是喜欢try了if.但是,在这种情况下,EAFP和性能考虑因素都不应成为选择一个而非另一个的理由.相反,你应该选择一个正确的.

使用isfile是因为它使您的代码容易出现竞争条件.假设有人在您调用之后isfile和实际打开之前删除了文件- 您将获得虚假异常.但是,由于代码首先检查文件的存在,权限,所有权等,然后打开它,因此出现了无数的安全漏洞 - 攻击者可能会更改链接指向的文件.

此外,还有其他原因导致open失败而不仅仅是文件不存在:

>>> os.path.isfile('/etc/shadow') True >>> open('/etc/shadow') Traceback (most recent call last): File "", line 1, in PermissionError: [Errno 13] Permission denied: '/etc/shadow'

isfile也相当于额外的系统调用,这本身比捕获异常更昂贵; 只是单独进行系统调用会使得捕获异常的开销相形见绌.正如您所说,您希望大多数文件名实际存在,所花费的时间isfile只是额外的开销.

我在Ubuntu 16.04上使用Python 3进行了一些计时,而os.path.isfile对于不存在的文件,我花了/etc/foo大约2μs(对于现有文件来说实际上更快/etc/passwd,1.8μs); 试图打开一个不存在的文件并失败并捕获IOError花费〜3μs - 因此检查文件的使用os.path.isfile是否比使用检查它的存在更快open; 但这不是你的代码需要做的事情:它需要读取可以读取的文件的内容,并返回其内容,为此,如果预计存在66%的文件,那么open无需检查就绝对更快而不是先使用isfile检查,所以这应该是一个明智的选择.

PS:你的代码可能会泄露其他Pythons上的打开文件而不是CPython,并且不必要地复杂化.使用with块,这变得更清洁:

def read_path(path): try: with open(path, "rb") as f: return f.read() except IOError: return None


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3