2009-12-11 4 views
6

ist Python Ausnahme langsam? Ich bin freundlich mit Python-Ausnahmen zu strukturieren Programm folgen in meiner Web-Anwendung, und ich frage mich, wie das Auslösen von Ausnahmen die Leistung meiner Anwendung beeinflussen wird. Was sind deine Gedanken?Wie langsam sind Python/Django-Ausnahmen?

Welche der folgenden Aussagen ist in Bezug auf Speicher und CPU weniger teuer?

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


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

Naked Ausnahmeklauseln sollten vermieden werden. – u0b34a0f6ae

Antwort

15

Die Handhabung von Ausnahmen ist die geringste Ihrer Sorgen in Bezug auf die Leistung. Ich würde jedoch vorschlagen, dass Sie für Sie von Django bereitgestellt eine Verknüpfung verwenden:

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

, die entweder das Objekt artist zuordnet oder gibt einen 404. Es ist eine Win-Win!

Sie sollten auch die django-debug-toolbar, die Rendering/CPU-Zeit, Kontextwechsel und alle Arten von anderen nützlichen Leckerbissen von Daten für Entwickler bietet und möglicherweise nur das Werkzeug, das Sie benötigen.

+0

das nutzt auch Ausnahmen richtig? Ich weiß nicht, wie es sich von der Methode 1 unterscheidet. – Mohamed

+3

Ja, aber es erspart Ihnen, die Logik selbst durchführen zu müssen. Es ist identisch mit Methode 1, außer dass Sie ein "except" ohne Ausnahme verwendet haben, um eine Übereinstimmung zu erreichen, was bedeutet, dass es irgendeine Ausnahme (nicht gut) fangen würde. Haben Sie keine Angst vor Ausnahmen, sie sind ein wesentlicher Teil davon, wie die Sprache funktioniert! Sie müssen nur sicherstellen, dass Sie sie mit Bedacht behandeln. – jathanism

+3

+1 für "Die Handhabung von Ausnahmen ist die geringste Ihrer Sorgen in Bezug auf die Leistung." – cethegeek

10

Um die Leistung Ihres Systems wirklich zu verstehen, müssen Sie es profilieren. Aber Python ist eine Sprache, die das Verwenden von Ausnahmen wie diesem ermutigt, so dass sie keinen ungewöhnlichen Aufwand haben wie in anderen Sprachen.

Zum Beispiel diskutieren manchmal Menschen diese Wahl:

if hasattr(obj, "attr"): 
    use(obj.attr) 
else: 
    some_other(obj) 

oder:

try: 
    use(obj.attr) 
except AttributeError: 
    some_other(obj) 

Die Leute, die sagen, dass Sie die erste verwenden sollten Notwendigkeit, die Ausnahme zu vermeiden, dass intern zu verstehen, hasattr ist implementiert durch Zugriff auf das Attribut und Rückgabe von False, wenn ein AttributeError ausgelöst wird. In der Tat verwenden beide Code-Chunks Ausnahmen.

8

This guy habe eine nette kleine write-up Test-Versuch/außer Geschwindigkeit mit dicts, ich sicher, es würde etwas Analoges in Ihrem Fall haben. So oder so, ein schönes Profil zu machen, wird Ihnen die besten Informationen geben.

Verwandte Themen