Python hasattr vs getattr
2017-03-27 19:53
627 查看
我最近读过一些tweet和关于hasattr 的python文档,它说:
hasattr(对象,名称)
参数是一个对象和一个字符串。如果字符串是对象属性之一的名称,则结果为True,如果不是则为False。(这是通过调用getattr(object,name)并查看它是否引发AttributeError来实现的。)
在这种情况下,用一个非常简单的python代码进行性能测试:
结果:
如果属性不存在,并且getattr和hasattr之间的差异更大,我也尝试了会发生什么。所以我到目前为止看到的是getattr比hasattr慢,但在文档中它表示它调用getattr。
已经搜索到了sattr和getattr的CPython实现,似乎都调用了下一个函数:
但是在getattr中比在hasattr中有更多的样板,可能会使它变慢。
有没有人知道为什么在文档中我们说hasattr调用getattr,我们似乎鼓励用户使用getattr而不是hasattr,当它真的不是由于性能?只是因为它更多的是pythonic?
也许我做错了我的测试
hasattr(对象,名称)
参数是一个对象和一个字符串。如果字符串是对象属性之一的名称,则结果为True,如果不是则为False。(这是通过调用getattr(object,name)并查看它是否引发AttributeError来实现的。)
在这种情况下,用一个非常简单的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)
结果:
$ python test.py hasattr(a, 'a') 1.26515984535 getattr(a, 'a') 1.32518696785
如果属性不存在,并且getattr和hasattr之间的差异更大,我也尝试了会发生什么。所以我到目前为止看到的是getattr比hasattr慢,但在文档中它表示它调用getattr。
已经搜索到了sattr和getattr的CPython实现,似乎都调用了下一个函数:
v = PyObject_GetAttr(v, name);
但是在getattr中比在hasattr中有更多的样板,可能会使它变慢。
有没有人知道为什么在文档中我们说hasattr调用getattr,我们似乎鼓励用户使用getattr而不是hasattr,当它真的不是由于性能?只是因为它更多的是pythonic?
也许我做错了我的测试
相关文章推荐
- python中dir(), hasattr(), getattr(), setattr()的使用
- python 面向对象中一些常用内建函数【getattr(), setattr(). hasattr(). delattr()...】
- Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- python 中getattr(object,name,default),setattr(object,name,default),hasattr(),delattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- Python 类 setattr、getattr、hasattr 的使用
- Python 类 setattr、getattr、hasattr 的使用
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的hasattr、getattr
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- python 面向对象中一些常用内建函数【getattr(), setattr(). hasattr(). delattr()...】
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()
- Python的getattr(),setattr(),delattr(),hasattr()