时间统计%time和%timeit_python
202170713
https://blog.csdn.net/a18852867035/article/details/82257682
python計算時間的兩種方式:time與datetime
https://www.cnblogs.com/adamans/articles/14121126.html
裝飾器實現(xiàn)
對于規(guī)模更大、運行時間更長的數(shù)據(jù)分析應(yīng)用程序,你可能會希望測試一下各個部分或函數(shù)調(diào)用或語句的執(zhí)行時間。你可能會希望了解某個復(fù)雜計算過程中到底是哪些函數(shù)占用的時間最多。幸運的是,在開發(fā)和測試代碼的過程中,IPython能夠讓你輕松得到這些信息。使用內(nèi)置的time模塊及其time.clock和time.time函數(shù)手工測試代碼執(zhí)行時間是一件令人煩悶的事情,因為你必須編寫許多一模一樣的了無生趣的公式化代碼:
- import time
- start = time.time()
- for i in range(iterations):
- # 這里放一些待執(zhí)行的代碼
- elapsed_per = (time.time() - start) / iterations
由于這是一個非常常用的功能,所以IPython專門提供了兩個魔術(shù)函數(shù)(%time和%timeit)以便自動完成該過程。%time一次執(zhí)行一條語句,然后報告總體執(zhí)行時間。假設(shè)我們有一大堆字符串,希望對幾個“能夠選出具有特殊前綴的字符串”的函數(shù)進(jìn)行比較。下面是一個擁有60萬字符串的數(shù)組,以及兩個不同的“能夠選出其中以foo開頭的字符串”的方法:
- # 一個非常大的字符串?dāng)?shù)組
- strings = ['foo', 'foobar', 'baz', 'qux', 'python', 'Guido Van Rossum'] * 100000
- method1 = [x for x in strings if x.startswith('foo')]
- method2 = [x for x in strings if x[:3] == 'foo']
看上去它們的性能表現(xiàn)應(yīng)該差不多,對吧?我們通過%time來確認(rèn)一下:
- In [561]: %time method1 = [x for x in strings if x.startswith('foo')]
- CPU times: user 0.19 s, sys: 0.00 s, total: 0.19 s
- Wall time: 0.19 s
- In [562]: %time method2 = [x for x in strings if x[:3] == 'foo']
- CPU times: user 0.09 s, sys: 0.00 s, total: 0.09 s
- Wall time: 0.09 s
墻上時間(Wall time)是我們最感興趣的數(shù)字。所以,看上去第一個方法耗費了兩倍以上的時間,但這并不是一個非常精確的結(jié)果。如果你對相同語句多次執(zhí)行%time的話,就會發(fā)現(xiàn)其結(jié)果是會變的。為了得到更為精確的結(jié)果,需要使用魔術(shù)函數(shù)%timeit。對于任意語句,它會自動多次執(zhí)行以產(chǎn)生一個非常精確的平均執(zhí)行時間。
- In [563]: %timeit [x for x in strings if x.startswith('foo')]
- 10 loops, best of 3: 159 ms per loop
- In [564]: %timeit [x for x in strings if x[:3] == 'foo']
- 10 loops, best of 3: 59.3 ms per loop
這個貌似平淡無奇的例子正好說明了一個事實:我們非常有必要了解Python標(biāo)準(zhǔn)庫、NumPy、pandas以及本書中所用到的其他庫的性能特點。在大型數(shù)據(jù)分析應(yīng)用程序中,這些不起眼的毫秒數(shù)是會不斷累積的!
對于那些執(zhí)行時間非常短(甚至是那些微秒(1e-6秒)或納秒(1e-9秒)級的)的分析語句和函數(shù)而言,%timeit是非常有用的。雖然這些時間值小到幾乎可以忽略不計,但同樣執(zhí)行100萬次一個20微秒的函數(shù),所用的時間要比一個5微秒的多15秒。在上面那個例子中,我們可以直接對那兩個字符串運算進(jìn)行比較以了解其性能特點:
- In [565]: x = 'foobar'
- In [566]: y = 'foo'
- In [567]: %timeit x.startswith(y)
- 1000000 loops, best of 3: 267 ns per loop
- In [568]: %timeit x[:3] == y
- 10000000 loops, best of 3: 147 ns per loop
總結(jié)
以上是生活随笔為你收集整理的时间统计%time和%timeit_python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对装饰器@wraps的解释(一看就懂)-
- 下一篇: python常用魔法函数