2016-04-20 3 views
0

Hallo Ich versuche, die Laufzeit für meine FFT-Code-Formular numpy zu schätzen. Mit unterschiedlicher Eingangslänge N. Das Folgende ist mein Code.Laufzeit für Python

import cmath 
import math 
from random import uniform 
from numpy.fft import fft 
import time 
for i in range(3,10): 
    N = 2**i 
    x = [uniform(-32768,32767) for i in range(N)] 
    t0 = time.clock() 
    X = fft(x) 
    t1 = time.clock() 
    print t1-t0 

Dies ist das Ergebnis, das ich bekam, die erste Zeile mit Eingabelänge N = 3 sollte die schnellste, aber egal sein, wie oft ich laufe, ist die erste, immer die größte. Ich denke, das ist ein Problem mit Timer, aber ich kenne den genauen Grund dafür nicht. Kann mir das jemand erklären?

Output:

4.8e-05 
3e-05 
1.7e-05 
6e-05 
3.1e-05 
5.4e-05 
9.6e-05 
+1

Alle diese Operationen haben Overhead. Es ist sehr gut möglich, dass 2 ** 3 = 8 eine so seltene Anwendung für eine FFT ist, dass der Implementierer es wirklich nicht für wichtig hielt, schneller als 32 oder 64 Punkte zu sein. Meiner Erfahrung nach waren FFTs von weniger als 256 Datenpunkten äußerst selten (könnte für einige Spektrogramme nützlich sein). Um zuverlässigere Daten zu erhalten, würde ich alle 1000 Male laufen und dann die Zeit mitteln. Zeitrelais von nur wenigen Mikrosekunden könnten leicht durch andere Teile des Codes als die FFT beeinflusst werden. – roadrunner66

+0

aber wenn ich den Startpunkt von i = 2 ändere, wird der langsamste zu i = 2. Ich frage mich also, ob es eine bessere Möglichkeit gibt, die Laufzeit zu berechnen. –

+0

roadrunner66 schrieb über einen besseren Weg, es zu Zeit. Auch sind die Größen Ihrer Zeit wirklich winzig. Diese Zeiten liegen bei etwa 50 Mikrosekunden. Ich bin mir nicht sicher, aber ich denke, dass es zu diesen Zeiten eine sehr große Fehlerspanne geben könnte. Es wäre also gut, öfter (mindestens 1000 Mal) zu laufen. Auch, warum der erste ist am langsamsten (ist es? Sieht aus wie der 6. und letzte Lauf sind am längsten): Vielleicht recycelt Python Daten/Speicher von den vorherigen Läufen? Aber das ist nur eine wilde Vermutung. Roadrunner's Antwort ist wirklich gut. – krork

Antwort

1

Das Zeitintervall zu klein ist, genau durch time.clock() gemessen werden, wie es in dem Latenz-Jitter O Anruf ist. Machen Sie stattdessen genug Arbeit (führen Sie jedes fft ein paar tausend oder Millionen mal durch), bis die zu messende Arbeit ein paar Sekunden dauert. Wiederholen Sie außerdem jede Messung mehrmals und nehmen Sie einen Durchschnittswert, da möglicherweise andere Systemgemeinkosten (Cache-Flushes, Prozessschalter usw.) die Leistung variieren können.

Verwandte Themen