欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 性能提升的幾種方法

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

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

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

 程序的優(yōu)化核心點(diǎn)在于盡量減少操作跨度,包括代碼執(zhí)行時間上的跨度以及內(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ù)量較小時直接累加更快
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)化之取元素(使用?;蚣拇嫫?,避免訪問內(nèi)存)

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

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

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

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

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)算開銷較大,比乘法大
      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)化算法時間復(fù)雜度  

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

七、合理使用copy和deepcopy  

對于dict和list等數(shù)據(jù)結(jié)構(gòu)的對象,直接賦值使用的是引用的方式。而有些情況下需要復(fù)制整個對象,這時可以使用copy包里的copy和deepcopy,這兩個函數(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ù),后兩行對應(yīng)的是兩個timeit的輸出,下同。由此可見后者慢一個數(shù)量級。

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

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

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

 八、使用dict或set查找元素

python 字典和集合都是使用hash表來實(shí)現(xiàn)(類似c++標(biāo)準(zhǔn)庫unordered_map),查找元素的時間復(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)行時間最短。

九、合理使用(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é)論:盡量使用生成器去遍歷。

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

相關(guān)文章

  • python:print格式化輸出到文件的實(shí)例

    python:print格式化輸出到文件的實(shí)例

    今天小編就為大家分享一篇python:print格式化輸出到文件的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Django實(shí)現(xiàn)文件上傳下載功能

    Django實(shí)現(xiàn)文件上傳下載功能

    這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)文件上傳下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python讀取csv文件做K-means分析詳情

    Python讀取csv文件做K-means分析詳情

    這篇文章主要介紹了Python讀取csv文件做K-means分析詳情,基于時間序列的分析2D讀取時間列和高程做一下分析。下文更多詳細(xì)介紹需要的小伙伴可以參考一下
    2022-03-03
  • python查詢MySQL將數(shù)據(jù)寫入Excel

    python查詢MySQL將數(shù)據(jù)寫入Excel

    這篇文章主要介紹了python如何查詢MySQL將數(shù)據(jù)寫入Excel,幫助大家利用python高效的辦公,感興趣的朋友可以了解下
    2020-10-10
  • Python報錯ValueError:?cannot?convert?float?NaN?to?integer的解決方法

    Python報錯ValueError:?cannot?convert?float?NaN?to?intege

    在Python編程中,我們經(jīng)常需要處理各種數(shù)據(jù)類型,包括浮點(diǎn)數(shù)和整數(shù),然而,有時候我們可能會遇到一些意外的情況,比如將一個包含NaN(Not?a?Number)的浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)時,就會拋出錯誤,本文將探討這個錯誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下
    2024-09-09
  • Python使用configparser庫讀取配置文件

    Python使用configparser庫讀取配置文件

    這篇文章主要介紹了Python使用configparser庫讀取配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • python之消除前綴重命名的方法

    python之消除前綴重命名的方法

    今天小編就為大家分享一篇python之消除前綴重命名的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python爬蟲獲取基金列表

    Python爬蟲獲取基金列表

    這篇文章主要介紹了Python爬蟲獲取基金列表,python爬蟲用來收集數(shù)據(jù)是最直接和常用的方法,可以使用python爬蟲程序獲得大量的數(shù)據(jù),下文更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全

    使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全

    數(shù)據(jù)可視化是通過圖形、圖表、地圖等可視元素將數(shù)據(jù)呈現(xiàn)出來,以便更容易理解、分析和解釋,它是將抽象的數(shù)據(jù)轉(zhuǎn)化為直觀形象的過程,本文給大家介紹了使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全,需要的朋友可以參考下
    2024-06-06
  • python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法

    python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06

最新評論