小编rau*_*ido的帖子

Python hasattr vs getattr

我最近一直在阅读一些关于hasattr的推文python文档,它说:

hasattr(对象,名称)

参数是一个对象和一个字符串.如果字符串是>>对象属性之一的名称,则结果为True,否则返回False.(这是通过调用getattr(object,name)并查看它是否引发AttributeError来实现的.)

Python中有一句座右铭,就是我通常同意的许可更容易要求宽恕.

在这种情况下,我尝试使用一个非常简单的python代码进行性能测试:

import timeit
definition="""\
class A(object):
    a = 1
a = A()
"""

stm="""\
hasattr(a, 'a')
"""
print timeit.timeit(stmt=stm, setup=definition, number=10000000)

stm="""\
getattr(a, 'a')
"""
print timeit.timeit(stmt=stm, setup=definition, number=10000000)
Run Code Online (Sandbox Code Playgroud)

结果如下:

$ python test.py
hasattr(a, 'a')
1.26515984535

getattr(a, 'a')
1.32518696785
Run Code Online (Sandbox Code Playgroud)

如果属性不存在且getattr和hasattr之间的差异更大,我也尝试了会发生什么.所以我到目前为止看到的是getattr比hasattr慢,但在文档中它说它调用了getattr.

我搜索了hasattrgetattr的CPython实现,似乎都调用了下一个函数:

v = PyObject_GetAttr(v, name);
Run Code Online (Sandbox Code Playgroud)

但是getattr中的样板比hasattr中的样板更多,这可能使它更慢.

有谁知道为什么在文档中我们说hasattr调用getattr并且我们似乎鼓励用户使用getattr而不是hasattr,当它真的不是由于性能?只是因为它更pythonic?

也许我在测试中做错了什么:)

谢谢,

劳尔

python cpython python-2.7 python-3.x

11
推荐指数
1
解决办法
2万
查看次数

标签 统计

cpython ×1

python ×1

python-2.7 ×1

python-3.x ×1