2016-06-10 16 views
-1

Ich habe einen Funktionsdatensatz definiert, der Wert an eine Liste als Listen für eine Dauer von Time anfügt.Wenn ich diese Funktion für aufrufen Beim ersten Mal hängt es 19 Werte an Listen an, aber wenn ich es zum zweiten Mal anrufe, fügt es 20 Werte an Listen an, obwohl der Zeitparameter, den ich beide Male verwendet habe, 1 Sek. war Werte werden an eine Liste angehängt, wenn ich die Funktion mehrmals aufruft?Führen Sie eine Funktion für eine Dauer von 5 Sekunden genau jedes Mal mit time.time() in Python

import time 
lists=[] 
first_list=[] 
second_list=[] 
def record(lists,Time): 
    start_time=time.time() 
    print "start_time",start_time 
    print "time.time",time.time() 
    while(time.time()-start_time)<=Time: 

      lists.append(1) 
      print "list",lists 
      print "length of list after appending",len(lists) 



record(first_list,0.05)#first time 
print 1 
time.sleep(5) 
record(second_list,0.05) #second time 
+2

Die Anzahl der mal läuft es nicht direkt auf Zeit basiert aber mehr darüber, was passiert auf Ihrem Computer zu der Zeit, wenn Sie wirklich konsistente Ergebnisse erhalten, ist es möglich, dass Garbage Collection härter arbeitet während der zweiten Anruf. –

+0

Also muss ich die Werte in der Liste von meinem ersten Anruf und zweiten Anruf vergleichen, kann ich nur vergleichen, wenn Listen von gleicher Größe sind, oder? – Sai

+2

Wie hängt es 20 Werte an, wenn die Append-Funktion len (Listen) <= 18 überprüft? –

Antwort

0

Die Zeit, die es dauert, um etwas zu tun, ist nicht behoben. Es dauert so lange wie es dauert. Aber Sie müssen beide gleich sein, also machen Sie sie gleich, indem Sie beide überprüfen. Dieser Code erledigt die gewünschte Menge an Arbeit und ruft dann time.sleep() auf, bis der verbleibende Zeitblock abgelaufen ist. Das ist viel besser als wiederholtes Wiederholen (looping) und Überprüfen von time(), da das Schleifen und Überprüfen der Zeit es der CPU schwer macht, nichts zu tun. time.sleep ist speziell da, um die CPU nicht zu benutzen.

import time 

def record(mylist, duration, count): 
    start_time=time.time() 
    while len(mylist) < count: 
     mylist.append(1) 

    remaining_time = time.time() - start_time; 
    time.sleep(duration - remaining_time) 

print "calling first pass" 
start_time=time.time() 
l1 = [] 
record(l1, 5, 100) #second time 
actual_duration = time.time() - start_time 
print "length is", len(l1), "actual time was", actual_duration 

print "calling second pass" 
start_time=time.time() 
l2 = [] 
record(l2, 5, 100) #second time 
actual_duration = time.time() - start_time 
print "length is", len(l2), "actual time was", actual_duration 

Offensichtlich, wenn Sie versuchen, mehr als Sie in der angegebenen Zeit tun können, werden Sie nicht. Vielleicht können Sie einen Fehler zurückgeben, wenn das passiert? Wenn Sie time() während der Funktion überprüfen, können Sie früher beenden, aber ich würde nicht empfehlen, es zu oft zu überprüfen.

+0

Also, indem wir obigen Code verwenden, können wir eine Liste der gleichen Länge für jeden Funktionsaufruf unabhängig von der Zeit erhalten, richtig? – Sai

+0

Wenn genug Zeit ist, ja. Wenn die Zeit zu kurz ist, läuft es über. Willst du, dass ich es umschreibe, um früh zu beenden? –

+0

nein das ist in Ordnung – Sai

0

die Anzahl, wie oft die Liste angehängt wird ist fast willkürlich, die genaue Zeit, die zum größten Teil durch folgende Faktoren beeinträchtigt wird, auszuführen nimmt, was passiert, auf Ihrem Computer zu dem Zeitpunkt zu laufen. Zum Beispiel, wenn Sie Ihren Internetbrowser während des zweiten Anrufs geöffnet haben, was die genaue Ausführungszeit verlangsamen könnte.

Auf meinem Rechner rufen beide im Durchschnitt hängten nur 4 Werte jeden Anruf, war aber manchmal 5.

Gibt es eine Möglichkeit, dass ich dieselbe nicht von Werten erhalten könnte zu einer Liste erhalten angefügt, wenn Ich rufe die Funktion mehrmals an?

Ja: stützen nicht die Anzahl der Elemente angehängt es auf die Zeit, sondern stützen sie auf die Anzahl, wie oft Sie wollen anhängen auszuführen nimmt:

def record(list_to_append_to, times_to_append): 
    for _ in range(times_to_append): 
     list_to_append_to.append(1) 

oder ähnlich könnte man .extend verwenden :

def record(list_to_extend, extend_length): 
    list_to_extend.extend(1 for _ in range(extend_length) 
+0

Also wie kann ich zwei Listen vergleichen, die während einer Sekunde angefügt werden? – Sai

+0

Was versuchst du eigentlich @Sai zu machen? Sie haben nur eine Liste in Ihrem Beispiel, so dass ich nicht verstehe, was Sie vergleichen. –

+0

Ich habe gerade meine Frage geändert. Sorry dafür. Jetzt will ich erste und zweite Liste vergleichen.Aber sie werden von unterschiedlicher Größe sein, weil ich Zeit verwende. Gibt es irgendeine Methode, die ich verwenden kann, damit meine first_list und second_list dieselbe Größe haben? – Sai