av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何給你的程序做性能測試

瀏覽:3日期:2022-07-15 18:51:21

問題

你想測試你的程序運(yùn)行所花費(fèi)的時(shí)間并做性能測試。

解決方案

如果你只是簡單的想測試下你的程序整體花費(fèi)的時(shí)間, 通常使用Unix時(shí)間函數(shù)就行了,比如:

bash % time python3 someprogram.pyreal 0m13.937suser 0m12.162ssys 0m0.098sbash %

如果你還需要一個(gè)程序各個(gè)細(xì)節(jié)的詳細(xì)報(bào)告,可以使用 cProfile 模塊:

bash % python3 -m cProfile someprogram.py 859647 function calls in 16.016 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 263169 0.080 0.000 0.080 0.000 someprogram.py:16(frange) 513 0.001 0.000 0.002 0.000 someprogram.py:30(generate_mandel) 262656 0.194 0.000 15.295 0.000 someprogram.py:32(<genexpr>) 1 0.036 0.036 16.077 16.077 someprogram.py:4(<module>) 262144 15.021 0.000 15.021 0.000 someprogram.py:4(in_mandelbrot) 1 0.000 0.000 0.000 0.000 os.py:746(urandom) 1 0.000 0.000 0.000 0.000 png.py:1056(_readable) 1 0.000 0.000 0.000 0.000 png.py:1073(Reader) 1 0.227 0.227 0.438 0.438 png.py:163(<module>) 512 0.010 0.000 0.010 0.000 png.py:200(group) ...bash %

不過通常情況是介于這兩個(gè)極端之間。比如你已經(jīng)知道代碼運(yùn)行時(shí)在少數(shù)幾個(gè)函數(shù)中花費(fèi)了絕大部分時(shí)間。 對(duì)于這些函數(shù)的性能測試,可以使用一個(gè)簡單的裝飾器:

# timethis.pyimport timefrom functools import wrapsdef timethis(func): @wraps(func) def wrapper(*args, **kwargs): start = time.perf_counter() r = func(*args, **kwargs) end = time.perf_counter() print(’{}.{} : {}’.format(func.__module__, func.__name__, end - start)) return r return wrapper

要使用這個(gè)裝飾器,只需要將其放置在你要進(jìn)行性能測試的函數(shù)定義前即可,比如:

>>> @timethis... def countdown(n):... while n > 0:... n -= 1...>>> countdown(10000000)__main__.countdown : 0.803001880645752>>>

要測試某個(gè)代碼塊運(yùn)行時(shí)間,你可以定義一個(gè)上下文管理器,例如:

from contextlib import contextmanager@contextmanagerdef timeblock(label): start = time.perf_counter() try: yield finally: end = time.perf_counter() print(’{} : {}’.format(label, end - start))

下面是使用這個(gè)上下文管理器的例子:

>>> with timeblock(’counting’):... n = 10000000... while n > 0:... n -= 1...counting : 1.5551159381866455>>>

對(duì)于測試很小的代碼片段運(yùn)行性能,使用 timeit 模塊會(huì)很方便,例如:

>>> from timeit import timeit>>> timeit(’math.sqrt(2)’, ’import math’)0.1432319980012835>>> timeit(’sqrt(2)’, ’from math import sqrt’)0.10836604500218527>>>

timeit 會(huì)執(zhí)行第一個(gè)參數(shù)中語句100萬次并計(jì)算運(yùn)行時(shí)間。 第二個(gè)參數(shù)是運(yùn)行測試之前配置環(huán)境。如果你想改變循環(huán)執(zhí)行次數(shù), 可以像下面這樣設(shè)置 number 參數(shù)的值:

>>> timeit(’math.sqrt(2)’, ’import math’, number=10000000)1.434852126003534>>> timeit(’sqrt(2)’, ’from math import sqrt’, number=10000000)1.0270336690009572>>>

討論

當(dāng)執(zhí)行性能測試的時(shí)候,需要注意的是你獲取的結(jié)果都是近似值。 time.perf_counter() 函數(shù)會(huì)在給定平臺(tái)上獲取最高精度的計(jì)時(shí)值。 不過,它仍然還是基于時(shí)鐘時(shí)間,很多因素會(huì)影響到它的精確度,比如機(jī)器負(fù)載。 如果你對(duì)于執(zhí)行時(shí)間更感興趣,使用 time.process_time() 來代替它。例如:

from functools import wrapsdef timethis(func): @wraps(func) def wrapper(*args, **kwargs): start = time.process_time() r = func(*args, **kwargs) end = time.process_time() print(’{}.{} : {}’.format(func.__module__, func.__name__, end - start)) return r return wrapper

最后,如果你想進(jìn)行更深入的性能分析,那么你需要詳細(xì)閱讀 time 、timeit 和其他相關(guān)模塊的文檔。 這樣你可以理解和平臺(tái)相關(guān)的差異以及一些其他陷阱。 還可以參考13.13小節(jié)中相關(guān)的一個(gè)創(chuàng)建計(jì)時(shí)器類的例子。

以上就是Python如何給你的程序做性能測試的詳細(xì)內(nèi)容,更多關(guān)于Python做性能測試的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 中文字幕精品视频在线观看 | 黄色成人免费在线观看 | 欧美精品一区二区三区蜜桃视频 | 国产午夜在线观看 | 一区二区三区欧美 | 在线观看成人 | 国产激情偷乱视频一区二区三区 | 久久之精品 | 国产精品久久久久久高潮 | 三级在线视频 | 成人免费高清 | 欧洲一区二区在线 | 国产高清一区二区三区 | www.国产91| 久久99国产精一区二区三区 | av网站在线播放 | aacc678成免费人电影网站 | 久久亚洲国产精品日日av夜夜 | 精品一区二区在线观看 | 亚洲激情在线 | 国产精品av久久久久久毛片 | 国产精品国产三级国产播12软件 | h视频免费在线观看 | 成人片免费看 | 欧美13videosex性极品 | 国产精品亚洲精品日韩已方 | 黄色毛片一级 | 2021狠狠天天天 | 国产一区亚洲 | 国产日韩欧美中文字幕 | 国产高清一区二区三区 | 国产日韩欧美在线 | 婷婷去俺也去 | 久久综合九九 | 亚洲1区| 午夜精品久久久久99蜜 | 中文字幕在线精品 | 97综合在线| 国产中文字幕在线 | 男女免费在线观看视频 | av片在线免费看 |