最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 性能提升的幾種方法

 更新時(shí)間:2024年09月24日 17:08:48   投稿:lqh  
本篇文章主要介紹python 性能提升的幾種方法,并附有代碼參考示例,有需要的小伙伴可以參考下

關(guān)于python 性能提升的一些方案。

一、函數(shù)調(diào)用優(yōu)化(空間跨度,避免訪(fǎng)問(wèn)內(nèi)存)

 程序的優(yōu)化核心點(diǎn)在于盡量減少操作跨度,包括代碼執(zhí)行時(shí)間上的跨度以及內(nèi)存中空間跨度。

1.大數(shù)據(jù)求和,使用sum

a = range(100000)
%timeit -n 10 sum(a)
10 loops, best of 3: 3.15 ms per loop
%%timeit
  ...: s = 0
  ...: for i in a:
  ...:  s += i
  ...:
100 loops, best of 3: 6.93 ms per loop

2.小數(shù)據(jù)求和,避免使用sum

%timeit -n 1000 s = a + b + c + d + e + f + g + h + i + j + k # 數(shù)據(jù)量較小時(shí)直接累加更快
1000 loops, best of 3: 571 ns per loop
%timeit -n 1000 s = sum([a,b,c,d,e,f,g,h,i,j,k]) # 小數(shù)據(jù)量調(diào)用 sum 函數(shù),空間效率降低
1000 loops, best of 3: 669 ns per loop

結(jié)論:大數(shù)據(jù)求和sum效率高,小數(shù)據(jù)求和直接累加效率高。

二、for循環(huán)優(yōu)化之取元素(使用?;蚣拇嫫?,避免訪(fǎng)問(wèn)內(nèi)存)

for lst in [(1, 2, 3), (4, 5, 6)]: # lst 索引需要額外開(kāi)銷(xiāo)
  pass

 應(yīng)盡量避免使用索引。

for a, b, c in [(1, 2, 3), (4, 5, 6)]: # better
  pass

相當(dāng)于給每一個(gè)元素直接賦值。

def force():
 lst = range(4)
 for a1 in [1, 2]:
   for a2 in lst:
     for a3 in lst:
       for b1 in lst:
         for b2 in lst:
           for b3 in lst:
             for c1 in lst:
               for c2 in lst:
                 for c3 in lst:
                   for d1 in lst:
                     yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1)
                      
%%timeit -n 10
for t in force():
  sum([t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]])
10 loops, best of 3: 465 ms per loop
%%timeit -n 10
for a1, a2, a3, b1, b2, b3, c1, c2, c3, d1 in force():
  sum([a1, a2, a3, b1, b2, b3, c1, c2, c3, d1])
10 loops, best of 3: 360 ms per loop

三、生成器優(yōu)化(查表代替運(yùn)算)

def force(start, end): # 用于密碼程序
  for i in range(start, end):
    now = i
    sublst = []
    for j in range(10):
      sublst.append(i % 10) # 除法運(yùn)算開(kāi)銷(xiāo)較大,比乘法大
      i //= 10
    sublst.reverse()
    yield(tuple(sublst), now)
def force(): # better
 lst = range(5)
 for a1 in [1]:
   for a2 in lst:
     for a3 in lst:
       for b1 in lst:
         for b2 in lst:
           for b3 in lst:
             for c1 in lst:
               for c2 in lst:
                 for c3 in lst:
                   for d1 in lst:
                     yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1)
  
r0 = [1, 2] # 可讀性與靈活性
r1 = range(10)
r2 = r3 = r4 = r5 = r6 = r7 = r8 = r9 = r1
force = ((a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
      for a0 in r0 for a1 in r1 for a2 in r2 for a3 in r3 for a4 in r4
      for a5 in r5 for a6 in r6 for a7 in r7 for a8 in r8 for a9 in r9)

 四、冪運(yùn)算優(yōu)化(pow(x,y,z)) 

def isprime(n):
  if n & 1 == 0:
    return False
  k, q = find_kq(n)
  a = randint(1, n - 1)
  if pow(a, q, n) == 1: # 比使用 a ** q % n 運(yùn)算優(yōu)化數(shù)倍
    return True
  for j in range(k):
    if pow(a, pow(2, j) * q, n) == n - 1: # a **((2 ** j) * q) % n
      return True
  return False

 結(jié)論:pow(x,y,z)優(yōu)于x**y%z.

 五、除法運(yùn)算優(yōu)化

In [1]: from random import getrandbits
 
In [2]: x = getrandbits(4096)
 
In [3]: y = getrandbits(2048)
 
In [4]: %timeit -n 10000 q, r = divmod(x, y)
10000 loops, best of 3: 10.7 us per loop
 
In [5]: %timeit -n 10000 q, r = x//y, x % y
10000 loops, best of 3: 21.2 us per loop

 結(jié)論:divmod優(yōu)于//和%。

 六、優(yōu)化算法時(shí)間復(fù)雜度  

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

七、合理使用copy和deepcopy  

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

In [23]: import copy
In [24]: %timeit -n 10 copy.copy(a)
10 loops, best of 3: 606 ns per loop
In [25]: %timeit -n 10 copy.deepcopy(a)
10 loops, best of 3: 1.17 us per loop

 timeit后面的-n表示運(yùn)行的次數(shù),后兩行對(duì)應(yīng)的是兩個(gè)timeit的輸出,下同。由此可見(jiàn)后者慢一個(gè)數(shù)量級(jí)。

 關(guān)于copy的一個(gè)例子:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

 發(fā)生的事情是這樣的,[[]]是包含一個(gè)空列表的只有一個(gè)元素的列表,所以[[]] * 3的所有三個(gè)元素都是(指向)這個(gè)空列表。修改lists的任何元素都修改這個(gè)列表。修改效率高。

 八、使用dict或set查找元素

python 字典和集合都是使用hash表來(lái)實(shí)現(xiàn)(類(lèi)似c++標(biāo)準(zhǔn)庫(kù)unordered_map),查找元素的時(shí)間復(fù)雜度是O(1)。

In [1]: r = range(10**7)
In [2]: s = set(r) # 占用 588MB 內(nèi)存
In [3]: d = dict((i, 1) for i in r) # 占用 716MB 內(nèi)存
In [4]: %timeit -n 10000 (10**7) - 1 in r
10000 loops, best of 3: 291 ns per loop
In [5]: %timeit -n 10000 (10**7) - 1 in s
10000 loops, best of 3: 121 ns per loop
In [6]: %timeit -n 10000 (10**7) - 1 in d
10000 loops, best of 3: 111 ns per loop

結(jié)論:set 的內(nèi)存占用量最小,dict運(yùn)行時(shí)間最短。

九、合理使用(generator)和yield(節(jié)省內(nèi)存)

In [1]: %timeit -n 10 a = (i for i in range(10**7)) # 生成器通常遍歷更高效
10 loops, best of 3: 933 ns per loop
In [2]: %timeit -n 10 a = [i for i in range(10**7)]
10 loops, best of 3: 916 ms per loop
In [1]: %timeit -n 10 for x in (i for i in range(10**7)): pass
10 loops, best of 3: 749 ms per loop
In [2]: %timeit -n 10 for x in [i for i in range(10**7)]: pass
10 loops, best of 3: 1.05 s per loop

結(jié)論:盡量使用生成器去遍歷。

以上就是對(duì)python 性能提升的一些方案,后續(xù)繼續(xù)補(bǔ)充,需要的可以看下。

相關(guān)文章

  • Python?Decorator的設(shè)計(jì)模式演繹過(guò)程解析

    Python?Decorator的設(shè)計(jì)模式演繹過(guò)程解析

    本文主要梳理了Python?decorator的實(shí)現(xiàn)思路,解釋了為什么Python?decorator是現(xiàn)在這個(gè)樣子,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Django中自定義模型管理器(Manager)及方法

    Django中自定義模型管理器(Manager)及方法

    這篇文章主要介紹了Django中自定義模型管理器(Manager)及方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 一文解密Python的弱引用

    一文解密Python的弱引用

    弱引用在很多語(yǔ)言中都存在,最常用來(lái)解決循環(huán)引用問(wèn)題,本文就來(lái)和大家一起探索一下python中的弱引用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • python 實(shí)現(xiàn)dict轉(zhuǎn)json并保存文件

    python 實(shí)現(xiàn)dict轉(zhuǎn)json并保存文件

    今天小編就為大家分享一篇python 實(shí)現(xiàn)dict轉(zhuǎn)json并保存文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python實(shí)現(xiàn)類(lèi)的創(chuàng)建與使用方法示例

    Python實(shí)現(xiàn)類(lèi)的創(chuàng)建與使用方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)類(lèi)的創(chuàng)建與使用方法,結(jié)合簡(jiǎn)單計(jì)算器功能實(shí)例分析了Python類(lèi)的定義與使用方法,需要的朋友可以參考下
    2017-07-07
  • Pytorch 中net.train 和 net.eval的使用說(shuō)明

    Pytorch 中net.train 和 net.eval的使用說(shuō)明

    這篇文章主要介紹了Pytorch 中net.train 和 net.eval的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Pytorch中的variable, tensor與numpy相互轉(zhuǎn)化的方法

    Pytorch中的variable, tensor與numpy相互轉(zhuǎn)化的方法

    這篇文章主要介紹了Pytorch中的variable, tensor與numpy相互轉(zhuǎn)化的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python 讀取豎線(xiàn)分隔符的文本方法

    python 讀取豎線(xiàn)分隔符的文本方法

    今天小編就為大家分享一篇python 讀取豎線(xiàn)分隔符的文本方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例

    pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例

    本文主要介紹了pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作

    pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作

    這篇文章主要介紹了pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03

最新評(píng)論

明光市| 东辽县| 洪雅县| 利川市| 潞城市| 双柏县| 白朗县| 全椒县| 留坝县| 新巴尔虎右旗| 崇州市| 运城市| 新泰市| 会宁县| 红河县| 利辛县| 峨山| 衡山县| 桦川县| 江永县| 南郑县| 渝中区| 宜宾市| 大荔县| 石棉县| 库车县| 阳春市| 台江县| 论坛| 海阳市| 渭南市| 东阳市| 遂溪县| 加查县| 昂仁县| 定陶县| 门头沟区| 内乡县| 桐庐县| 屏边| 淮安市|