0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python迭代調(diào)用內(nèi)置函數(shù)計時比較(上)

jf_78858299 ? 來源:梯閱線條小梯子 ? 作者:小梯子 ? 2023-02-21 14:56 ? 次閱讀

python迭代工具自動調(diào)用迭代對象next方法,對迭代對象進(jìn)行遍歷。

python的for循環(huán)、列表解析、map方法、生成器表達(dá)式、生成器方法都是迭代工具。

python可迭代對象包括:字符串、列表、元組、字典、集合、range、enumerate、文件等。

1.1 python迭代調(diào)用內(nèi)置函數(shù)計時比較

描述

timetool.py:計時模塊,循環(huán)調(diào)用func函數(shù)1000次,返回使用時間和最后一次調(diào)用結(jié)果。

time.perf_counter():返回性能計數(shù)器的值,單位為秒。兩次調(diào)用之間的差值用于計時。

timeiterenv.py:各種迭代環(huán)境調(diào)用內(nèi)置函數(shù)ord(),返回列表。對各種迭代函數(shù)調(diào)用計時模塊的計時函數(shù)進(jìn)行計時,將計時結(jié)果存放在列表,并且按從低到高的順序?qū)τ嫊r結(jié)果進(jìn)行排序。

sorted():key = lambda x:x[1],按自定義鍵函數(shù)進(jìn)行排序,x為sorted的第1個參數(shù)對應(yīng)排序?qū)ο螅瑇[1]表示按第1個索引值進(jìn)行排序,本例中對應(yīng)函數(shù)計時結(jié)果。

通過例子得出:迭代環(huán)境調(diào)用內(nèi)置函數(shù)耗時從低到高的順序為:

NO 函數(shù) 描述
1 mapCall map迭代工具
2 listComp 列表解析
3 genFunc 生成器函數(shù)
4 genExpr 生成器表達(dá)式
5 forloop for循環(huán)

示例

# timetool.py
import time
reps = 1000
repslist = range(reps)

def timer(func,*pargs,**kargs):
   begin = time.perf_counter()
   for i in repslist:
       ret = func(*pargs,**kargs)
   usetime = time.perf_counter() - begin
   return (usetime,ret)

# timeiterenv.py
import sys,timertool
s = '梯閱線條tyxt'*1000

def forloop():
   res = []
   for x in s:
       res.append(ord(x))
   return res
   
def listComp():
   return [ord(x) for x in s]

def mapCall():
   return list(map(ord,s))
   
def genExpr():
   return list(ord(x) for x in s)
   
def genFunc():
   def gen():
       for x in s:
           yield ord(x)
   return list(gen())
   
print(sys.version)
reslist=[]
for test in (forloop,listComp,mapCall,genExpr,genFunc):
   usetime,result = timertool.timer(test)
   reslist.append((test.__name__,usetime,result[0],result[-1],len(result)))

print('-'*33)        
reslistsort=sorted(reslist,key = lambda x:x[1])
for L in reslistsort:
   print('%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
print('-'*33)

# 迭代調(diào)用內(nèi)置函數(shù)計時比較結(jié)果
# 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]
# ---------------------------------
# mapCall :0.20925=>[26799....116....8000]
# listComp :0.42197=>[26799....116....8000]
# genFunc :0.57103=>[26799....116....8000]
# genExpr :0.57259=>[26799....116....8000]
# forloop :0.66177=>[26799....116....8000]
# ---------------------------------

1.2 python迭代調(diào)用用戶函數(shù)計時比較

描述

python各種迭代環(huán)境調(diào)用用戶函數(shù)ord(x)+1,進(jìn)行計時比較。

timertool.py不變,修改timeiterevn.py即可。

通過例子得出:迭代環(huán)境調(diào)用用戶函數(shù)耗時從低到高的順序為:

NO 函數(shù) 描述
1 listComp 列表解析
2 genExpr 生成器表達(dá)式
3 genFunc 生成器函數(shù)
4 forloop for循環(huán)
5 mapCall map迭代工具

示例

# timeiterevn.py
import sys,timertool
s = '梯閱線條tyxt'*1000

def forloop():
   res = []
   for x in s:
       res.append(ord(x)+1)
   return res
   
def listComp():
   return [ord(x) for x in s]

def mapCall():
   return list(map(lambda x:ord(x)+1,s))
   
def genExpr():
   return list(ord(x)+1 for x in s)
   
def genFunc():
   def gen():
       for x in s:
           yield ord(x)+1
   return list(gen())

commstr = '# '
print(commstr+str(sys.version))
reslist=[]
for test in (forloop,listComp,mapCall,genExpr,genFunc):
   usetime,result = timertool.timer(test)
   reslist.append((test.__name__,usetime,result[0],result[-1],len(result)))

print(commstr+'-'*33)        
reslistsort=sorted(reslist,key = lambda x:x[1])
for L in reslistsort:
   print(commstr+'%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
print(commstr+'-'*33)
# 調(diào)用用戶函數(shù)計時比較結(jié)果
# 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]
# ---------------------------------
# listComp :0.50272=>[26799....116....8000]
# genExpr :0.83316=>[26800....117....8000]
# genFunc :0.85477=>[26800....117....8000]
# forloop :0.94426=>[26800....117....8000]
# mapCall :0.96591=>[26800....117....8000]
# ---------------------------------
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    313

    瀏覽量

    20923
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84294
  • for循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    2483
收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解python調(diào)用函數(shù)

    函數(shù)被定義后,本身是不會自動執(zhí)行的,只有在被調(diào)用后,函數(shù)才會被執(zhí)行,得到相應(yīng)的結(jié)果。但是在 Python 中我們要注意一個關(guān)鍵點,就是Python
    發(fā)表于 10-01 10:45 ?562次閱讀

    快速掌握Python的遞歸函數(shù)與匿名函數(shù)調(diào)用

    也有迭代的需求,即將自定義類型定義成迭代器類型即可(需要在類里實現(xiàn)__iter__()和__next__()方法,可供next和iter函數(shù)調(diào)用該對象)。for循環(huán)本質(zhì)
    發(fā)表于 07-19 16:22

    python迭代

    的,哪些是不可迭代的。但是對新手來說,可能需要借助一些函數(shù)來判別,比如 Python 內(nèi)置的 collections.abc 模塊,這個模塊只有在
    發(fā)表于 02-24 15:42

    python內(nèi)置函數(shù)詳細(xì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是python內(nèi)置函數(shù)詳細(xì)資料概述。
    發(fā)表于 11-18 08:00 ?0次下載

    python的常用函數(shù)有哪些

    map() 是 Python 內(nèi)置的高階函數(shù),它接收一個函數(shù) f 和一個list ,并通過把函數(shù) f 依次作用在list 的每個元素
    發(fā)表于 02-25 11:52 ?9次下載
    <b class='flag-5'>python</b>的常用<b class='flag-5'>函數(shù)</b>有哪些

    python提供的68個內(nèi)置函數(shù)詳解

    ? 內(nèi)置函數(shù)就是Python給你提供的,拿來直接用的函數(shù),比如print.,input等。 截止到python版本3.6.2 ,
    的頭像 發(fā)表于 10-27 09:14 ?2142次閱讀

    進(jìn)階必備的68個Python 內(nèi)置函數(shù)分析

    來源: pypypypy 內(nèi)置函數(shù)就是Python給你提供的,拿來直接用的函數(shù),比如print.,input等。 截止到python版本3.
    的頭像 發(fā)表于 11-01 10:18 ?3953次閱讀

    python迭代器詳解

    ] for i in alist:... print(i)...012345 2. 是否可迭代? 對 Python 比較熟悉的朋友,肯定知道哪些數(shù)據(jù)類型是可迭代的,哪些是不可
    的頭像 發(fā)表于 02-24 15:42 ?1300次閱讀

    Python支持遞歸函數(shù)

    Python支持遞歸函數(shù)——即直接或間接地調(diào)用自身以進(jìn)行循環(huán)的函數(shù)。遞歸是頗為高級的話題,并且它在Python中相對少見。然而,它是一項應(yīng)該
    的頭像 發(fā)表于 02-21 14:28 ?602次閱讀

    python迭代調(diào)用內(nèi)置函數(shù)計時比較(下)

    python迭代工具自動調(diào)用迭代對象next方法,對迭代對象進(jìn)行遍歷。 python的fo
    的頭像 發(fā)表于 02-21 14:56 ?495次閱讀

    python常用的內(nèi)置函數(shù)和模塊

    python數(shù)字包含常用的內(nèi)置函數(shù)和模塊,比如pow()、abs()、floor()、int()等函數(shù),以及math、random等模塊。
    的頭像 發(fā)表于 03-10 10:10 ?880次閱讀

    python定義函數(shù)調(diào)用函數(shù)的順序

    定義函數(shù)調(diào)用函數(shù)的順序 函數(shù)被定義后,本身是不會自動執(zhí)行的,只有在被調(diào)用后,函數(shù)才會被執(zhí)行,得
    的頭像 發(fā)表于 10-04 17:17 ?1169次閱讀

    python函數(shù)函數(shù)之間的調(diào)用

    函數(shù)函數(shù)之間的調(diào)用 3.1 第一種情況 程序代碼如下: def x ( f ): def y (): print ( 1 ) return y def f (): print ( 2 )x(f
    的頭像 發(fā)表于 10-04 17:17 ?530次閱讀

    python調(diào)用math函數(shù)的方法

    Python編程中,數(shù)學(xué)函數(shù)是非常重要的工具,我們可以使用它們進(jìn)行各種數(shù)值計算、幾何運算和統(tǒng)計分析等操作。Python的標(biāo)準(zhǔn)庫中內(nèi)置了很多數(shù)學(xué)函數(shù)
    的頭像 發(fā)表于 11-22 11:01 ?2458次閱讀

    不屬于python內(nèi)置函數(shù)

    Python是一種高級編程語言,它提供了許多內(nèi)置函數(shù),可以幫助開發(fā)人員更輕松地處理各種任務(wù)。但是,在Python中并非所有的函數(shù)都是
    的頭像 發(fā)表于 11-29 14:27 ?1265次閱讀