2009-12-11 45 views
6

是python異常慢嗎? 我很善良使用python異常來構造我的web應用程序中的程序,我想知道如何拋出異常會影響我的應用程序的性能。你的想法是什麼?Python/Django異常有多慢?

以下哪種語句在內存和cpu方面較便宜?

try: 
    artist = Artist.objects.get(id=id) 
except: 
    raise Http404 


artist = Artist.objects.filter(id=id) 
if not artist: 
    return HttpResponse('404') 
+5

應避免裸體除外條款。 – u0b34a0f6ae 2009-12-11 02:14:19

回答

15

處理異常將成爲您在性能方面最擔心的問題。不過我建議,您使用Django提供一個快捷方式給你:

from django.shortcuts import get_object_or_404 
artist = get_object_or_404(Artist, id=id) 

該對象或者分配給artist或返回404這是雙贏!

此外,你應該看看django-debug-toolbar,它爲開發人員提供渲染/ CPU時間,上下文切換以及各種其他有用的數據信息,可能只是您需要的工具。

+0

這也使用例外權利?我不知道它與方法1有什麼不同。 – Mohamed 2009-12-11 01:48:10

+3

是的,但它可以讓你不必自己執行邏輯。它與方法1相同,不同之處在於你使用了一個沒有異常的'except'來匹配,這意味着它會捕獲任何異常(不好)。不要害怕例外,它們是語言運作的核心部分!你只需要確保你明智地處理它們。 – jathanism 2009-12-11 03:03:23

+3

+1「處理異常將成爲您在性能方面擔心最小的問題。」 – cethegeek 2009-12-11 03:32:25

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。所以實際上,這兩個代碼塊都使用異常。

8

This guy做了一個很好的小試寫測試/除了速度與字典,我相信它會有一些類似於你的情況。無論哪種方式,做一個好的配置文件會給你最好的信息。