亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python執(zhí)行時(shí)間計(jì)算方法以及優(yōu)化總結(jié)

 更新時(shí)間:2022年08月03日 15:54:48   作者:用余生去守護(hù)  
python腳本運(yùn)行時(shí)間遠(yuǎn)遠(yuǎn)大于python腳本中統(tǒng)計(jì)的計(jì)算時(shí)間,所以本文將為大家分享就幾個(gè)Python執(zhí)行時(shí)間計(jì)算方法以及優(yōu)化,感興趣的可以了解一下

一、時(shí)間不一致的猜想

python腳本運(yùn)行時(shí)間遠(yuǎn)遠(yuǎn)大于python腳本中統(tǒng)計(jì)的計(jì)算時(shí)間

猜想:

1.python中用到的是py2neo的寫數(shù)據(jù)異步,阻塞進(jìn)程運(yùn)行;

2.python腳本使用統(tǒng)計(jì)時(shí)間的方式是time.clock(),而這種方式統(tǒng)計(jì)的是CPU的執(zhí)行時(shí)間,不是程序的執(zhí)行時(shí)間。

程序執(zhí)行時(shí)間 = CPU運(yùn)行時(shí)間 + IO時(shí)間 + 休眠或等待時(shí)間

二、原因探索

1.方法一

import asyncio
import datetime
starttime = datetime.datetime.now()
# long running
# do something other

async def sayhi():
    print("你好,若竹")
    await asyncio.sleep(10)
    print("用余生去守護(hù)")

asyncio.run(sayhi())


endtime = datetime.datetime.now()
print(("程序運(yùn)行時(shí)間為:")+ str((endtime-starttime).seconds)+"秒")

輸出:

你好,若竹
用余生去守護(hù)
程序運(yùn)行時(shí)間為:10秒

datetime.datetime.now()獲取的是當(dāng)前日期,在程序執(zhí)行結(jié)束之后,這個(gè)方式獲得的時(shí)間值為程序執(zhí)行的時(shí)間。

2.方法二

import asyncio
import datetime
import time

starttime = time.time()
# long running
# do something other

async def sayhi():
    print("你好,若竹")
    await asyncio.sleep(10)
    print("用余生去守護(hù)")

asyncio.run(sayhi())

endtime = time.time()
print("程序運(yùn)行時(shí)間為:"+ str(float(endtime-starttime))+"秒")

輸出:

你好,若竹
用余生去守護(hù)
程序運(yùn)行時(shí)間為:10.002257108688354秒

time.time()獲取自紀(jì)元以來的當(dāng)前時(shí)間(以秒為單位)。如果系統(tǒng)時(shí)鐘提供它們,則可能存在秒的分?jǐn)?shù),所以這個(gè)地方返回的是一個(gè)浮點(diǎn)型類型。這里獲取的也是程序的執(zhí)行時(shí)間。

3.方法三

import asyncio
import datetime
import time

starttime = time.clock()
# long running
# do something other

async def sayhi():
    print("你好,若竹")
    await asyncio.sleep(10)
    print("用余生去守護(hù)")

asyncio.run(sayhi())

endtime = time.clock()
print("程序運(yùn)行時(shí)間為:"+ str(float(endtime-starttime))+"秒")

輸出:

.\py_study.py:807: DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
  starttime = time.clock()
你好,若竹
用余生去守護(hù)
.\py_study.py:818: DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
  endtime = time.clock()
程序運(yùn)行時(shí)間為:10.0219916秒

Deprecation Warning: time. clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time. perf_counter or time. process_time instead

棄用警告:時(shí)間。clock在Python 3.3中已棄用,并將從Python 3.8中移除:使用time。perf_counter或時(shí)間。process_time代替。

代碼如下:

import asyncio
import datetime
import time

starttime = time.perf_counter()
# long running
# do something other

async def sayhi():
    print("你好,若竹")
    await asyncio.sleep(10)
    print("用余生去守護(hù)")

asyncio.run(sayhi())

endtime = time.perf_counter()
print("程序運(yùn)行時(shí)間為:"+ str(float(endtime-starttime))+"秒")

輸出:

你好,若竹
用余生去守護(hù)
程序運(yùn)行時(shí)間為:10.060287599999999秒

三、python 運(yùn)行效率慢的原因

1.簡介

編程語言的效率一方面指開發(fā)效率,即程序員完成編碼所需的時(shí)間,另一方面是運(yùn)行效率,即計(jì)算任務(wù)所需的時(shí)間。編碼效率和運(yùn)行效率往往很難兼顧。

2.運(yùn)行效率慢的原因

1.python 是動(dòng)態(tài)語言,造成運(yùn)行時(shí)的不確定性影響運(yùn)行效率;

動(dòng)態(tài)語言是一類在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語言,如新的函數(shù)、對(duì)象、代碼可以被引入,已有的函數(shù)可以被刪除或其他結(jié)構(gòu)上的變化等,該類語言更具有活性,但是不可避免的因?yàn)檫\(yùn)行時(shí)的不確定性也影響運(yùn)行效率。數(shù)據(jù)的比較和轉(zhuǎn)換類型的開銷很大,每次讀取、寫入或引用一個(gè)變量,都要檢查類型。很難優(yōu)化一種極具動(dòng)態(tài)性的語言。Python的許多替代語言之所以快得多,原因在于它們?yōu)榱诵阅茉陟`活性方面作出了犧牲。

2.python 是解釋執(zhí)行,不支持JIT(just in time compiler);

相比于C語言編譯性語言編寫的程序,Python是解釋執(zhí)行語言,其運(yùn)行過程是Python運(yùn)行文件程序時(shí),Python解釋器將源代碼轉(zhuǎn)換為字節(jié)碼,然后再由Python解釋器來執(zhí)行這些字節(jié)碼。其每次運(yùn)行都要進(jìn)行轉(zhuǎn)換成字節(jié)碼,然后再由虛擬機(jī)把字節(jié)碼轉(zhuǎn)換成機(jī)器語言,最后才能在硬件上運(yùn)行,與編譯性語言相比,其過程更復(fù)雜,性能肯定會(huì)受影響。

3.python 中一切皆對(duì)象,每個(gè)對(duì)象都需要維護(hù)引用計(jì)數(shù),增加額外工作;

Python是一門面向?qū)ο蟮木幊陶Z言,其設(shè)計(jì)理念是一切皆是對(duì)象,如數(shù)字、字符串、元組、列表、字典、函數(shù)、方法、類、模塊等都是對(duì)象,包括代碼,每個(gè)對(duì)象都需要維護(hù)引用計(jì)數(shù),因此,增加了額外工作,影響了性能。

4.python GIL,全局解釋器鎖導(dǎo)致無法實(shí)現(xiàn)真正的并發(fā);

GIL是Python最為詬病的一點(diǎn),因?yàn)镚IL,Python中的多線程并不能真正的并發(fā),即使在單線程,GIL也會(huì)帶來很大的性能影響,因?yàn)閜ython每執(zhí)行100個(gè)opcode就會(huì)嘗試線程的切換,因此,影響Python運(yùn)行效率。

5.垃圾回收機(jī)制,會(huì)中斷正在執(zhí)行的程序,造成所謂的卡頓;

Python采用標(biāo)記和分代的垃圾回收策略,每次垃圾回收的時(shí)候都會(huì)中斷正在執(zhí)行的程序,造成所謂的頓卡,影響運(yùn)行效率。

四、python 優(yōu)化

1.優(yōu)化算法:時(shí)間復(fù)雜度

算法的時(shí)間復(fù)雜度對(duì)程序的執(zhí)行效率影響最大,在python 中可以通過選擇合適的數(shù)據(jù)結(jié)構(gòu)來優(yōu)化時(shí)間復(fù)雜度,如list和set查找某一個(gè)元素的時(shí)間復(fù)雜度分別是O(n)和O(1).不同的場景有不同的優(yōu)化方式,總的來說,一般有分治,分支界限,貪心,動(dòng)態(tài)規(guī)劃等。

20減少冗余數(shù)據(jù)

如用上三角或下三角的方式去保存一個(gè)大的對(duì)稱矩陣。在0元素占大多數(shù)的矩陣?yán)锸褂孟∈杈仃嚤硎尽?/p>

3.合理使用copy與deepcopy

對(duì)于dict和list等數(shù)據(jù)結(jié)構(gòu)的對(duì)象,直接賦值使用的是引用的方式。而有些情況下需要復(fù)制整個(gè)對(duì)象,這時(shí)可以使用copy包里的copy和deepcopy,這兩個(gè)函數(shù)的不同之處在于后者是遞歸復(fù)制的。效率也不一樣:(以下程序在ipython中運(yùn)行)

4.使用dict或set查找元素

5.合理使用生成器(generator)和yield

6.優(yōu)化循環(huán)

7.優(yōu)化包含多個(gè)判斷表達(dá)式的順序

8.使用join合并迭代器中的字符串

9.選擇合適的格式化字符方式

10.不借助中間變量交換兩個(gè)變量的值

11.使用if is

12.使用級(jí)聯(lián)比較x < y < z

13.while 1 比 while True 更快

14.使用**而不是pow

15.使用 cProfile, cStringIO 和 cPickle等用c實(shí)現(xiàn)相同功能(分別對(duì)應(yīng)profile, StringIO, pickle)的包

16.使用最佳的反序列化方式

17.使用C擴(kuò)展(Extension)

18.并行編程

19.終級(jí)大殺器:PyPy

20.使用性能分析工具

到此這篇關(guān)于Python執(zhí)行時(shí)間計(jì)算方法以及優(yōu)化總結(jié)的文章就介紹到這了,更多相關(guān)Python執(zhí)行時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    本文主要介紹了pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • python 使用openpyxl讀取excel數(shù)據(jù)

    python 使用openpyxl讀取excel數(shù)據(jù)

    這篇文章主要介紹了python 使用openpyxl讀取excel數(shù)據(jù)的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python趣味爬蟲之爬取愛奇藝熱門電影

    Python趣味爬蟲之爬取愛奇藝熱門電影

    好久沒帶大家實(shí)現(xiàn)Python爬蟲了,文中有非常詳細(xì)的代碼示例,對(duì)不會(huì)爬蟲的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-06-06
  • Python列表去重的幾種方法整理

    Python列表去重的幾種方法整理

    這篇文章介紹了Python列表去重的幾種方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Python matplotlib繪制餅狀圖功能示例

    Python matplotlib繪制餅狀圖功能示例

    這篇文章主要介紹了Python matplotlib繪制餅狀圖功能,結(jié)合實(shí)例形式分析了Python使用matplotlib模塊進(jìn)行數(shù)值運(yùn)算與餅狀圖繪制相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • python中的queue隊(duì)列類型及函數(shù)用法

    python中的queue隊(duì)列類型及函數(shù)用法

    這篇文章主要介紹了python中的queue隊(duì)列類型及函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 深入淺析Python科學(xué)計(jì)算庫Scipy及安裝步驟

    深入淺析Python科學(xué)計(jì)算庫Scipy及安裝步驟

    這篇文章主要介紹了Python科學(xué)計(jì)算庫—Scipy的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python selenium模擬網(wǎng)頁點(diǎn)擊爬蟲交管12123違章數(shù)據(jù)

    Python selenium模擬網(wǎng)頁點(diǎn)擊爬蟲交管12123違章數(shù)據(jù)

    本次介紹怎么以模擬點(diǎn)擊方式進(jìn)入交管12123爬取車輛違章數(shù)據(jù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • python list轉(zhuǎn)矩陣的實(shí)例講解

    python list轉(zhuǎn)矩陣的實(shí)例講解

    今天小編就為大家分享一篇python list轉(zhuǎn)矩陣的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • pycharm導(dǎo)入第三方庫的兩種方法(永不報(bào)錯(cuò))

    pycharm導(dǎo)入第三方庫的兩種方法(永不報(bào)錯(cuò))

    這篇文章主要介紹了pycharm導(dǎo)入第三方庫的兩種方法(永不報(bào)錯(cuò)),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11

最新評(píng)論