成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讓Python程序快30%的技巧

開發 后端
一直以來Python性能是遭人詬病的問題之一,抱怨執行慢,沒法用。雖然再性能上語言的差異確實存在著明顯差異,但是我認為一個非常流行的語言,運行的快慢不會成為阻擾人們使用的因素。

 一直以來Python性能是遭人詬病的問題之一,抱怨執行慢,沒法用。雖然再性能上語言的差異確實存在著明顯差異,但是我認為一個非常流行的語言,運行的快慢不會成為阻擾人們使用的因素。如果是的話,可能是由于編寫的程序有問題,需要優化。本文蟲蟲就給大家介紹一下如何調試Python應用的性能,以及怎么對其進行優化。

 

 

 

[[312018]]

 

Python性能調試

要進行Python性能,前提條件是要找出程序中的性能瓶頸。找出程序中影響程序性能的代碼。有經驗的開發者一般都能很容易能找出程序的瓶頸,但對于普通碼農找出系統的問題代碼則很難,為了能快捷有效的發現程序的性能瓶頸就需要進行性能調試,此處我們以一個實際例子進行介紹,以下程序是計算e的x(1..n)次的冪,其代碼如下:

 

  1. # performance.py 
  2.  
  3. from decimal import * 
  4.  
  5. def exp(x): 
  6.  
  7. getcontext().prec += 2 
  8.  
  9. i, lasts, s, fact, num = 0, 0, 1, 1, 1 
  10.  
  11. while s != lasts: 
  12.  
  13. lasts = s 
  14.  
  15. i += 1 
  16.  
  17. fact *= i 
  18.  
  19. num *= x 
  20.  
  21. s += num / fact 
  22.  
  23. getcontext().prec -= 2 
  24.  
  25. return +s 
  26.  
  27. print(exp(Decimal(150))) 
  28.  
  29. print(exp(Decimal(400))) 
  30.  
  31. print(exp(Decimal(3000))) 

 

最簡單的調試

最簡單且實用的調試性能調試的方法是使用Linux的time命令,time可以計算程序執行的時間:

 

讓Python程序快30%的技巧

 

 

  1. time python3 performance.py 
  2.  
  3. 1.393709580666379697318341937E+65 
  4.  
  5. 5.221469689764143950588763007E+173 
  6.  
  7. 7.646200989054704889310727660E+1302 
  8.  
  9. real 0m15.185s 
  10.  
  11. user 0m15.100s 
  12.  
  13. sys 0m0.004s 

 

計算前兩個數的(150,400)很快,而第三個大一點時會很慢,總共要15秒多才算完,是有點卡頓(慢)。

time雖然很便捷有用,但是不能給我們詳細的代碼性能細節。

詳細性能分析cProfile

性能分析另一個常用的方法是使用cProfile,它可以提供很多性能信息

 

  1. python3 -m cProfile -s time performance.py 

 

讓Python程序快30%的技巧

 

 

例子中,我們使用了cProfile模塊和time參數運行測試腳本,以便按內部時間(cumtime)對行進行排序。如上圖所示,使用cProfile可以給很多內部的具體信息,通過我們可以知道主要耗時是由exp函數導致。知道了程序的性能瓶頸所在,我們就再說明Python性能分析和優化。

優化特定功能

知道了將性能的瓶頸所在(實例中是exp函數),我們為了進一步具體問題具體分析,我們使用一個簡單裝飾器,以便跳過其他代碼,專門分析性能瓶頸所設計的函數。然后使用裝飾器進行測試,具體代碼如下:

 

  1. def timeit_wrapper(func): 
  2.  
  3. @wraps(func) 
  4.  
  5. def wrapper(*args, **kwargs): 
  6.  
  7. start = time.perf_counter() # Alternatively, you can use time.process_time() 
  8.  
  9. func_return_val = func(*args, **kwargs) 
  10.  
  11. end = time.perf_counter() 
  12.  
  13. print('{0:<10}.{1:<8} : {2:<8}'.format(func.__module__, func.__name__, end - start)) 
  14.  
  15. return func_return_val 
  16.  
  17. return wrapper 

 

我們用這個裝飾器來測試exp:

 

  1. @timeit_wrapper 
  2.  
  3. def exp(x): 
  4.  
  5. ... 
  6.  
  7. print('{0:<10} {1:<8} {2:^8}'.format('module''function''time')) 
  8.  
  9. exp(Decimal(150)) 
  10.  
  11. exp(Decimal(400)) 
  12.  
  13. exp(Decimal(3000)) 

 

 

 

結果:

 

  1. module function time 
  2.  
  3. __main__ .exp : 0.00920036411844194 
  4.  
  5. __main__ .exp : 0.09822067408822477 
  6.  
  7. __main__ .exp : 15.228459489066154 

 

代碼中,我們用到了time包提供time.perf_counter函數,它還提供了另外一個函數time.process_time。兩者的區別在于perf_counter返回的絕對時間,包括Python程序進程未運行時的時間,它可能會受到計算機負載的影響。而process_time僅返回用戶時間(不包括系統時間),這僅是程序過程時間。

性能優化

最后是Python程序的性能優化,為了讓Python程序運行得更快,我們提供一些可供參考的性能優化構想和策略的,通過這些策略我們一半可以提高應用的運行速度,最高情況下可以讓你的應用快30%。

使用內建數據類型

很明顯,內建數據類型非常快,尤其是與自定義類型相比,比如樹或者鏈表。因為內建程序是用C實現的,所以其性能優勢是Python代碼所無法比擬的。

使用lru_cache緩存/記憶

很多時候緩存非常有效,可以極大的提高性能,尤其在數值計算和涉及大量重復調用(遞歸)時。考慮一個例子:

 

讓Python程序快30%的技巧

 

上面的函數使用time.sleep(2)模擬一個耗時的代碼。第一次使用參數1調用時,它將等待2秒,然后返回結果。再次調用時,由于結果已被緩存,將跳過函數的執行,直返回。用3調用時候由于參數不一樣會耗時2秒,總體耗時應該為4s,我們用time 驗證:

 

  1. real 0m4.061s 
  2.  
  3. user 0m0.040s 
  4.  
  5. sys 0m0.015s 

 

這和我們設想的一致。

使用局部變量

基于變量作用域中查找速度相關,在函數的局部變量具有很高的速度。其次是類級屬性(如self.name)和最慢的是全局變量,如time.time(最慢)。所以我們可以通過避免使用不必要的全局變量來提高性能。

使用函數

這似乎有點出乎意料,因為涉及函數的內存占用都在堆棧上,而函數返回也會有開銷。但是使用函數,可以避免使用全局變量,可以提高性能。因此,可以通過將整個代碼包裝在main函數中只調用一次來加速代碼。

避免使用屬性

另一個可以是影響程序性能的操作是點運算符訪問對象屬性。點運算符使用__getattribute__觸發會字典查找,會在代碼中產生額外的開銷。我們可以通過一些使用函數而不是類方法的方式避免點操作,比如下面例子

#慢代碼:

 

  1. import re 
  2.  
  3. def slow_func(): 
  4.  
  5. for i in range(10000): 
  6.  
  7. re.findall(regex, line) 

 

#快代碼

 

  1. from re import findall 
  2.  
  3. def fast_func(): 
  4.  
  5. for i in range(10000): 
  6.  
  7. findall(regex, line) 

 

使用f-string

在循環中使用格式符(%s)或.format()時,字符串操作可能會變得非常緩慢。為了進行性能優化,我們應該使用f-string。它是Python 3.6引入的很具可讀性,簡潔性和最快的方法。比如:

 

  1. s + ' ' + t 
  2.  
  3. ' '.join((s, t)) 
  4.  
  5. '%s %s' % (s, t) 
  6.  
  7. '{} {}'.format(s, t) 
  8.  
  9. Template('$s $t').substitute(s=s, t=t) # 慢代碼 
  10.  
  11.  
  12. f'{s} {t}' # 快代碼 

 

總結

性能的調試和優化是非常重要的碼農技術之一。本文中,我們提供了Python應用性能調試和優化的技巧和策略,希望能對大家有所幫助。

責任編輯:華軒 來源: 今日頭條
相關推薦

2021-06-07 11:40:26

Python命令代碼

2020-05-28 08:59:40

Python機器學習開發

2021-02-07 23:08:29

Python開發Java

2019-01-23 17:08:03

開發

2020-06-23 07:50:13

Python開發技術

2018-09-12 21:44:32

Linux命令行操作系統

2010-01-18 08:59:13

Windows 7系統速度

2024-08-02 16:20:06

2014-03-25 09:56:42

程序員30歲后

2019-09-09 16:30:42

Redis架構數據庫

2025-03-18 07:20:00

JavaScript開發字符串

2024-01-08 17:09:07

Python解釋器CPython

2024-11-11 17:00:27

字典壓縮Python代碼

2020-04-20 15:07:50

性能優化低效循環程序

2020-02-03 12:25:35

Python工具服務器

2022-02-18 11:51:36

Python代碼編程語言

2025-03-03 13:12:33

C#代碼Python

2014-04-10 13:15:54

PythonPython技巧

2024-10-08 10:24:41

Python編程語言

2022-01-06 22:31:21

Python技巧代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级特黄aaa大片在线观看 | 拍拍无遮挡人做人爱视频免费观看 | 日韩欧美国产精品 | 欧美性久久 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲欧美日韩高清 | 亚洲精品一区二区三区丝袜 | 日本三级在线 | 国产精品一区二区在线观看 | 涩涩片影院 | 日本电影韩国电影免费观看 | 日本精品一区 | 精精国产xxxx视频在线播放7 | 亚洲精品9999 | 无码一区二区三区视频 | 国产在线观看一区二区 | 国产区在线免费观看 | 久久久久国产一区二区 | 国产一区视频在线 | 精品久久香蕉国产线看观看亚洲 | 看特级黄色片 | 国产三级精品三级在线观看四季网 | 午夜三区 | 精品一区二区三区免费视频 | 国产精久久久久久 | 久久99久久| 涩涩视频在线观看免费 | 日韩精品一区二区三区高清免费 | 久久一区二区三区免费 | 国产日韩欧美中文 | 亚洲国产精品成人综合久久久 | 99re在线视频免费观看 | 91传媒在线观看 | 国产乱精品一区二区三区 | 国产精品7777777 | 久www| 精品一区二区久久久久久久网站 | 欧美老少妇一级特黄一片 | 黄色小视频入口 | 桃色五月| 日韩成年人视频在线 |