Python/Django 异常有多慢?
Python的异常处理慢吗? 我在我的网页应用程序中使用Python的异常来组织程序流程,我在想抛出异常会对我的应用性能产生什么影响。你们怎么看?
以下哪个说法在内存和CPU方面消耗更少?
try:
artist = Artist.objects.get(id=id)
except:
raise Http404
artist = Artist.objects.filter(id=id)
if not artist:
return HttpResponse('404')
3 个回答
8
这个人写了一篇不错的文章,测试了在使用字典时,try/except的速度。我相信在你的情况中也会有类似的情况。不管怎样,做一个详细的性能分析会给你最好的信息。
10
要真正了解你系统的性能,你需要进行性能分析。不过,Python这门语言鼓励使用异常处理,所以在这门语言里,使用异常不会像其他一些语言那样造成额外的负担。
比如,有时候人们会争论应该选择哪种写法:
if hasattr(obj, "attr"):
use(obj.attr)
else:
some_other(obj)
还是:
try:
use(obj.attr)
except AttributeError:
some_other(obj)
那些说应该使用第一种写法来避免异常的人,需要明白,hasattr这个函数的内部实现是通过访问属性,如果出现AttributeError(属性错误)就返回False。所以实际上,这两段代码都是在使用异常处理。
15
处理异常(错误)对性能的影响其实不大,你可以放心。不过,我建议你使用Django提供的一个快捷方式:
from django.shortcuts import get_object_or_404
artist = get_object_or_404(Artist, id=id)
这个快捷方式要么把对象赋值给artist
,要么返回一个404错误页面。这样做两全其美!
另外,你可以看看django-debug-toolbar,这个工具可以显示渲染时间、CPU使用时间、上下文切换等各种对开发者有帮助的数据,可能正是你需要的工具。