2016-06-06 7 views
1

In einer Django-Website pflegen (v 1.7), teile ich jeden 24-Stunden-Tag in verschiedene Zeitfenster, und dann je nachdem, in welchem ​​Zeitfenster ein Benutzer angemeldet ist, ich verarbeite etwas für den besagten Benutzer. Es spielt keine Rolle, welches Datum es ist, nur das Zeitfenster ist wichtig.Zwischenspeichern einer Funktion mit einigen Konstanten, in Django

Derzeit ist die Zeitfenster und die damit verbundene Verarbeitung sind in meinem views.py wie dies in einer Funktion gemacht:

from datetime import time as time_object 

def WhichWindow(time_now): 
    window1_least = time_object(hour=0, minute=0) 
    window1_most = time_object(hour=3, minute=0) 
    window2_least = time_object(hour=3, minute=0) 
    window2_most = time_object(hour=6, minute=30) 
    window3_least = time_object(hour=6, minute=30) 
    window3_most = time_object(hour=11, minute=50) 
    window4_least = time_object(hour=11, minute=50) 
    window4_most = time_object(hour=14, minute=55) 
    window5_least = time_object(hour=14, minute=55) 
    window5_most = time_object(hour=16, minute=55) 
    window6_least = time_object(hour=16, minute=55) 
    window6_most = time_object(hour=20, minute=0) 
    window7_least = time_object(hour=20, minute=0) 
    window7_most = time_object(hour=0, minute=0) 
    if window1_least <= time_now < window1_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window2_least <= time_now < window2_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window3_least <= time_now < window3_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window4_least <= time_now < window4_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window5_least <= time_now < window5_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window6_least <= time_now < window6_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window7_least <= time_now < window7_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    else: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    return variable1, variable2, variable3 

Hinweis: time_now in der Funktion im Wesentlichen datetime.now().time() ist.

Die obige Funktion wird sehr häufig für jeden Benutzer aufgerufen. Ich fühle, wenn ich cache meine Zeitfenster Definitionen, es wird eine Leistungssteigerung sein.

Was soll ich tun? Soll ich einfach den @cache_page(60 * 60 * 24) Dekorateur über diese Funktion hinzufügen? Ich denke, wenn ich das tue, wird auch das Ergebnis dieser Funktion zwischengespeichert, während ich nur die Zeitfensterdefinitionen zwischenspeichern möchte. Also was soll ich tun?

Bitte geben Sie den besten Weg, dies zu erreichen, zusammen mit einem anschaulichen Beispiel. Ich bin ein Neuling und umschlinge immer noch die meisten dieser Konzepte.

+0

„das wird cachen das Ergebnis dieser Funktion auch“ gut ... ja sein, dass ist was ein Cache tut. Wie möchten Sie die Funktion zwischenspeichern, wenn Sie das Ergebnis nicht zwischenspeichern möchten? – syntonym

+0

@ syntonym: Ich möchte nur die Zeitfensterdefinitionen zwischenspeichern. Sie sind statisch und ändern sich nicht. –

+0

Dann können Sie sie aus der Funktion im Modul (oder einem anderen Modul oder einer Klasse, wenn Sie bevorzugen) verschieben. – syntonym

Antwort

1

Wenn Sie wirklich Leistung verbessern müssen, sollten Sie die Fenster neu organisieren, da sie ab Mitternacht überprüft werden (was wahrscheinlich nicht der Zeitpunkt ist, an dem Sie den größten Teil des Datenverkehrs haben).

einfach einen zweiten Ansatz zu geben, können Sie etwas tun könnte:

from datetime import datetime, time 

windows = {} 

window1_least = time(hour=0, minute=0) 
window1_most = time(hour=3, minute=0) 
window2_least = time(hour=3, minute=0) 
window2_most = time(hour=6, minute=30) 
window3_least = time(hour=6, minute=30) 
window3_most = time(hour=11, minute=50) 
window4_least = time(hour=11, minute=50) 
window4_most = time(hour=14, minute=55) 
window5_least = time(hour=14, minute=55) 
window5_most = time(hour=16, minute=55) 
window6_least = time(hour=16, minute=55) 
window6_most = time(hour=20, minute=0) 
window7_least = time(hour=20, minute=0) 
window7_most = time(hour=0, minute=0) 


def which_window(minutes): 
    hour = minutes // 60 
    minute = minutes % 60 
    curent_time = time(hour=hour, minute=minute) 
    if window1_least <= curent_time < window1_most: 
     return 1 
    elif window2_least <= curent_time < window2_most: 
     return 2 
    elif window3_least <= curent_time < window3_most: 
     return 3 
    elif window4_least <= curent_time < window4_most: 
     return 4 
    elif window5_least <= curent_time < window5_most: 
     return 5 
    elif window6_least <= curent_time < window6_most: 
     return 6 
    elif window7_least <= curent_time < window7_most: 
     return 7 


windows = {minute: which_window(minute) for minute in range(1440)} 

def get_current_window(): 
    current_minute = datetime.now().hour * 60 + datetime.now().minute 
    return windows[current_minute] 

# Just for testing 
print get_current_window() 

Auf diese Weise erstellen Sie eine lange dict jede Minute in den Tag zu retten, aber es wird passieren, wenn (wenn der Server wird gestartet) und dann wird die Leistung viel besser, O (1), da Sie ein Diktat verwenden.

Sobald Sie diese haben, können Sie ein 1k Fenster erstellen, wenn Sie wollen, wird die Kontrolle halten „instant“

0

Wenn die Deklarationen statisch sind, können Sie sie aus der Funktion entfernen. So haben sie nicht jedes Mal ausgeführt werden soll die Funktion ausgeführt wird:

from datetime import time as time_object 


window1_least = time_object(hour=0, minute=0) 
window1_most = time_object(hour=3, minute=0) 
window2_least = time_object(hour=3, minute=0) 
window2_most = time_object(hour=6, minute=30) 
window3_least = time_object(hour=6, minute=30) 
window3_most = time_object(hour=11, minute=50) 
window4_least = time_object(hour=11, minute=50) 
window4_most = time_object(hour=14, minute=55) 
window5_least = time_object(hour=14, minute=55) 
window5_most = time_object(hour=16, minute=55) 
window6_least = time_object(hour=16, minute=55) 
window6_most = time_object(hour=20, minute=0) 
window7_least = time_object(hour=20, minute=0) 
window7_most = time_object(hour=0, minute=0) 


def WhichWindow(time_now): 

    if window1_least <= time_now < window1_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window2_least <= time_now < window2_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window3_least <= time_now < window3_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window4_least <= time_now < window4_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window5_least <= time_now < window5_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window6_least <= time_now < window6_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    elif window7_least <= time_now < window7_most: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    else: 
     variable1 = #something 
     variable2 = #something 
     variable3 = #something 
    return variable1, variable2, variable3 

Natürlich kann man sie auch in einem Modul, Klasse, Liste setzen könnte, ...

Via PEP8 Modulebene Konstanten groß geschrieben werden soll .

+0

Ich sehe, Sie wollten sie als globale Variablen definieren. Wenn ich also diese globalen Definitionen innerhalb einer Klasse oder Funktion verwende, sollte ich zuerst 'global window1_least',' global_window1_most' und so weiter deklarieren? –

+0

Sie müssen sie nicht erneut deklarieren, verwenden Sie sie einfach – dnaranjo

+1

Sie benötigen nur das Schlüsselwort 'global', wenn Sie in sie schreiben möchten (da andernfalls der geschriebene Wert im aktuellen Bereich statt des globalen Gültigkeitsbereichs liegt). Weil Sie sie nur lesen, brauchen Sie nicht global. – syntonym

Verwandte Themen