Python/Django 异常有多慢?

6 投票
3 回答
1701 浏览
提问于 2025-04-15 16:54

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使用时间、上下文切换等各种对开发者有帮助的数据,可能正是你需要的工具。

撰写回答