W Pythonie 3.4.1 staram się zmierzyć, jak długo zajmuje funkcję do uruchomienia i zakończenia, a następnie nagrywanie go. Obecnie to robię:

starttime = time.clock()
asyncio.wait_for((method()), 5)
endtime = time.clock()
print(endtime - starttime)

Zwykle powoduje to Pythona wyplunia coś około 6.29989986222767E-06 (lub 0,00000629989986222767e). Potem próbowałem go z czasem.Sleep:

starttime = time.clock()
asyncio.wait_for((time.sleep(3)), 5)
endtime = time.clock()
print(endtime - starttime)

Ponownie zaowocowało 6.87261802845284E-06, mimo że (przynajmniej myślę), powinno zająć 3 sekundy. Próbowałem tego za pomocą wątków, z tym samym wynikiem. Co myślisz? Jak mogę zmierzyć, jak długo zajmuje funkcję do uruchomienia i zakończenia?

5
Xanco 17 sierpień 2014, 20:14

3 odpowiedzi

Najlepsza odpowiedź

Generalnie używam tego dekoratora na czas moje funkcje:

import time                                                
def timeit(method):
    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()
        print '%r (%r, %r) %2.2f sec' % \
              (method.__name__, args, kw, te-ts)
        return result

    return timed

@timeit
def timeme():
    time.sleep(3)

time.time() Daje dokładniejsze czas dla benchmarków niż time.clock() przede wszystkim dlatego, że time.clock() mierzy czas procesora. time.time() powróci sekundy przekazane od epoki (tj. Czas ściany), co jest potrzebne.

Albo możesz również użyć timeit https://docs.Python.org/3 / filibrary/teeit.html.

2
zengr 17 sierpień 2014, 16:37

W przypadku szybkich analiz wydajności używam następujących dwóch linii (plus import):

import time
import numpy as np

t = time.time()
# ...
print np.round_(time.time() - t, 3), 'sec elapsed'

Jest krótki, prosty i zazwyczaj potrzebuję.

(W większości przypadków i tak importowałem numpy. Więc nie ma dla mnie nad głową.)

1
Falko 17 sierpień 2014, 16:44

Przyznam, że nie jestem bardzo zaznajomiony z Asyyncio Pythona, ale wierzę, że problem nie jest w twoim czasie, ale w twoim użyciu asyncio.

Myślę, że właśnie tworzysz przyszłość z wartością metody (), jednak to wszystko, co wystarczy: rzeczywiste tworzenie tej obietnicy.

Nie jest czas rzeczywistej oceny przyszłej wartości. Dlatego sen czasowy (3) i metoda () podejmuje mniej więcej tyle samo.

Proponuję próbować zmienić asyncio.wait_for((method()), 5) za pomocą yield from asyncio.wait_for((method()), 3) lub tylko timing method(), jeśli możesz.

0
Kobi K 18 sierpień 2014, 05:10