精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

老曹的文章:全棧必備 你需要了解的Python編程基礎(chǔ)

開(kāi)發(fā) 開(kāi)發(fā)工具
Python作為一種編程語(yǔ)言,被稱(chēng)為“膠水語(yǔ)言”,更被擁躉們譽(yù)為“最美麗”的編程語(yǔ)言,從云端到客戶(hù)端,再到物聯(lián)網(wǎng)終端,無(wú)所不在,同時(shí)還是人工智能優(yōu)選的編程語(yǔ)言。

據(jù)說(shuō):

2019年, 浙江信息技術(shù)高考可以考python了;

2018年, Python 進(jìn)入了小學(xué)生的教材;

2018年, 全國(guó)計(jì)算機(jī)等級(jí)考試,可以考python 了;

據(jù)外媒報(bào)道,微軟正考慮添加 Python 為官方的一種 Excel 腳本語(yǔ)言

……

Python作為一種編程語(yǔ)言,被稱(chēng)為“膠水語(yǔ)言”,更被擁躉們譽(yù)為“最美麗”的編程語(yǔ)言,從云端到客戶(hù)端,再到物聯(lián)網(wǎng)終端,無(wú)所不在,同時(shí)還是人工智能優(yōu)選的編程語(yǔ)言。

因此,從全棧的角度看, Python 是一門(mén)必備的語(yǔ)言,因?yàn)樗浅蓑?qū)動(dòng)和操作系統(tǒng)外,其他都可以做好。

不積跬步無(wú)以至千里,不積小流無(wú)以成江海。—— 荀子《勸學(xué)》

語(yǔ)法

Python使用空格或制表符縮進(jìn)的方式分隔代碼,Python 2 僅有31個(gè)保留字,而且沒(méi)有分號(hào)、begin、end等標(biāo)記。

可以組織成打油詩(shī), 更方便記憶:

  • Global is class,def not pass。
  • if eilf else, del as break。
  • raise in while,import from yield,
  • try for print,return and assert。
  • exec except with lambda,
  • finally or continue……

python中沒(méi)有提供定義常量的保留字,可以自己定義一個(gè)常量類(lèi)來(lái)實(shí)現(xiàn)常量的功能。python中有3種表示字符串類(lèi)型的方式,即單引號(hào)、雙引號(hào)、三引號(hào)。單引號(hào)和雙引號(hào)的作用是相同的,python程序員更喜歡用單引號(hào),C/Java程序員則習(xí)慣使用雙引號(hào)表示字符串。三引號(hào)中可以輸入單引號(hào)、雙引號(hào)或換行等字符。python不支持自增運(yùn)算符和自減運(yùn)算符,其他運(yùn)算符和表達(dá)式都是類(lèi)似的,尤其是分支判斷和循環(huán)。

Python的文件類(lèi)型分為3種,即源代碼、字節(jié)代碼和優(yōu)化代碼。這些都可以直接運(yùn)行,不需要進(jìn)行預(yù)編譯或連接。

數(shù)據(jù)類(lèi)型

Python中的基本數(shù)據(jù)類(lèi)型有布爾類(lèi)型,整數(shù),浮點(diǎn)數(shù)和字符串等。

Python 中的數(shù)據(jù)結(jié)構(gòu)主要有元組(tuple),列表(list)和字典(dictionary)。元組、列表和字符串都屬于序列,是具有索引和切片能力的集合。

元組初始化后不可修改,是寫(xiě)保護(hù)的。元組往往代表一行數(shù)據(jù),而元組中的元素代表不同的數(shù)據(jù)項(xiàng),可以把元組看做不可修改的數(shù)組。

  1. tuple_name=(“you”,”me”,”him”,”her”) 

列表可轉(zhuǎn)換為元組,是傳統(tǒng)意義上的數(shù)組,可以實(shí)現(xiàn)添加、刪除和查找操作,元素的值可以被修改。

  1. list_name=[“you”,”me”,”him”,”her”] 

字典是鍵值對(duì),相對(duì)于哈希表。

  1. dict_name={“y”:”you”, “m”:”me”, “hi”:”him”, “he”:”her”} 

列表推導(dǎo)(List Comprehensions)是構(gòu)建列表的快捷方式, 可讀性較好且效率更高. 運(yùn)用列表生成式,可以快速生成list,例如 得到當(dāng)前目錄下的所有目錄和文件:

  1. >>> import os 
  2. >>> [d for d in os.listdir('.')] 

也可以通過(guò)一個(gè)list推導(dǎo)出另一個(gè)list,代碼簡(jiǎn)潔,例如 將一個(gè)列表中的元素都變成小寫(xiě):

  1. >>> L = ['Hello''World''IBM''Apple'
  2. >>> [s.lower() for s in L] 

通過(guò)這些基本類(lèi)型,可以組成更有針對(duì)性需求的數(shù)據(jù)結(jié)構(gòu),例如字典嵌套形成的樹(shù)等, 針對(duì)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu), Python 中提供了大量的庫(kù)。

類(lèi)與繼承

python用class來(lái)定義一個(gè)類(lèi),當(dāng)所需的數(shù)據(jù)結(jié)構(gòu)不能用簡(jiǎn)單類(lèi)型來(lái)表示時(shí),就需要定義類(lèi),然后利用定義的類(lèi)創(chuàng)建對(duì)象。當(dāng)一個(gè)對(duì)象被創(chuàng)建后,包含了三方面的特性,即對(duì)象的句柄、屬性和方法。創(chuàng)建對(duì)象的方法:

  1. abel = Abel()  
  2.   Abel.do() 

類(lèi)的方法同樣分為公有方法和私有方法。私有函數(shù)不能被該類(lèi)之外的函數(shù)調(diào)用,私有的方法也不能被外部的類(lèi)或函數(shù)調(diào)用。python使用函數(shù)”staticmethod()“或”@ staticmethod“的方法把普通的函數(shù)轉(zhuǎn)換為靜態(tài)方法,相當(dāng)于全局函數(shù)。python的構(gòu)造函數(shù)名為init,析構(gòu)函數(shù)名為del。繼承的使用方法:

  1. class AbelApp(abel):  
  2.          def … 

Python 中的變量名解析遵循LEGB原則,本地作用域(Local),上一層結(jié)構(gòu)中的def或Lambda的本地作用域(Enclosing),全局作用域(Global),內(nèi)置作用域(Builtin),按順序查找。

和變量解析不同,Python 會(huì)按照特定的順序遍歷繼承樹(shù),就是方法解析順序(Method Resolution Order,MRO)。類(lèi)都有一個(gè)名為mro 的屬性,值是一個(gè)元組,按照方法解析順序列出各個(gè)超類(lèi),從當(dāng)前類(lèi)一直向上,直到 object 類(lèi)。

Python 中有一種特殊的類(lèi)是元類(lèi)(metaclass)。元類(lèi)是由“type”衍生而出,所以父類(lèi)需要傳入type,元類(lèi)的操作都在 new中完成。通過(guò)元類(lèi)創(chuàng)建的類(lèi),第一個(gè)參數(shù)是父類(lèi),第二個(gè)參數(shù)是metaclass。

包與模塊

python程序由包(package)、模塊(module)和函數(shù)組成。包是由一系列模塊組成的集合。包必須含有一個(gè)init.py文件,它用于標(biāo)識(shí)當(dāng)前文件夾是一個(gè)包。

模塊是處理某一類(lèi)問(wèn)題的函數(shù)和類(lèi)的集合。模塊把一組相關(guān)的函數(shù)或代碼組織到一個(gè)文件中,一個(gè)文件即是一個(gè)模塊。模塊由代碼、函數(shù)和類(lèi)組成。導(dǎo)入模塊使用import語(yǔ)句,不過(guò)模塊不限于此,還可以被 import 語(yǔ)句導(dǎo)入的模塊共有以下四類(lèi):

  • 使用Python寫(xiě)的程序( .py文件)
  • C或C++擴(kuò)展(已編譯為共享庫(kù)或DLL文件)
  • 包(包含多個(gè)模塊)
  • 內(nèi)建模塊(使用C編寫(xiě)并已鏈接到Python解釋器內(nèi))

Python 提供內(nèi)建函數(shù)__import__動(dòng)態(tài)加載 module,import 本質(zhì)上是調(diào)用 __import__加載 module 的, 函數(shù)原型如下:

  1. __import__(name, globals={}, locals={}, fromlist=[], level=-1) 

例如,加載名為 abel的目錄下所有模塊:

  1. def loadModules(): 
  2.     res = {} 
  3.     import os 
  4.     lst = os.listdir("abel"
  5.     dir = [] 
  6.     for d in lst: 
  7.         s = os.path.abspath("abel") + os.sep + d 
  8.         if os.path.isdir(s) and os.path.exists(s + os.sep + "__init__.py"): 
  9.             dir.append(d) 
  10.     # load the modules 
  11.     for d in dir: 
  12.         res[d] = __import__("abel." + d, fromlist = ["*"]) 
  13.     return res 

需要注意的是,如果輸入的參數(shù)如果帶有 “.”,采用 __import__直接導(dǎo)入 module 容易造成意想不到的結(jié)果。 OpenStack 的 oslo.utils 封裝了 __import__,支持動(dòng)態(tài)導(dǎo)入 class, object 等。

命名規(guī)范

Python 中的naming convention 以及 coding standard 有很多好的實(shí)踐,例如Google 的Python 編程規(guī)范等。 就命名規(guī)范而言, 可以參見(jiàn)Python之父Guido推薦的規(guī)范,見(jiàn)下表:

迭代器

迭代是數(shù)據(jù)處理的基礎(chǔ), 采用一種惰性獲取數(shù)據(jù)的方式, 即按需一次獲取一個(gè)數(shù)據(jù),這就是迭代器模式. 迭代器是一個(gè)帶狀態(tài)的對(duì)象,檢查一個(gè)對(duì)象 a 是否是迭代對(duì)象, 最準(zhǔn)確的方法是調(diào)用 iter(a) , 如果不可迭代, 則拋出 TypeError 異常.

標(biāo)準(zhǔn)的迭代器接口有兩個(gè)方法:

  • __next__: 返回下一個(gè)可用元素, 如沒(méi)有, 拋出StopIteration 異常.
  • __iter__: 返回self , 以便在應(yīng)該使用可迭代對(duì)象的地方使用迭代器.

可迭代對(duì)象一定不能是自身的迭代器. 也就是說(shuō), 可迭代對(duì)象必須實(shí)現(xiàn) __iter__方法, 但不能實(shí)現(xiàn) __next__ 方法.

實(shí)現(xiàn)一個(gè)斐波那契數(shù)列的迭代器例子如下:

  1. class Fibonacci: 
  2.     def __init__(self): 
  3.         self.prevous = 0 
  4.         self.current = 1 
  5.  
  6.     def __iter__(self): 
  7.         return self 
  8.  
  9.     def __next__(self): 
  10.         value = self.current 
  11.         self.current = self.prevous + self.current 
  12.         self.prevous = value 
  13.         return value 

迭代器就是實(shí)現(xiàn)了工廠模式的對(duì)象,有很多關(guān)于迭代器的例子,比如itertools函數(shù)返回的都是迭代器對(duì)象。

生成器

生成器算得上是Python中最吸引人的特性之一,生成器其實(shí)是一種特殊的迭代器,但不需要寫(xiě)__iter__()和__next__()方法了,只需要一個(gè)yiled關(guān)鍵字即可。python中的 yield 關(guān)鍵字, 用于構(gòu)建生成器(generator), 其作用與迭代器一樣. 還以斐波那契數(shù)列為例:

  1. def Fibonacci(): 
  2.     prevous, current = 0, 1 
  3.     while True
  4.         yield current 
  5.         prevous, current = currentcurrent + prevous 

所有的生成器都是迭代器, 都實(shí)現(xiàn)了迭代器的接口。 一般地,只要python函數(shù)的定義體中使用了 yield 關(guān)鍵字, 該函數(shù)就是生成器函數(shù). 調(diào)用生成器函數(shù)時(shí), 會(huì)返回一個(gè)生成器對(duì)象。也就是說(shuō), 生成器函數(shù)是生成器工廠。

生成器函數(shù)會(huì)創(chuàng)建一個(gè)生成器對(duì)象, 包裝生成器函數(shù)的定義體. 把生成器傳給 next(…) 函數(shù)時(shí), 生成器函數(shù)會(huì)向前執(zhí)行函數(shù)體中下一個(gè) yield 語(yǔ)句, 返回產(chǎn)出的值, 并在函數(shù)定義體的當(dāng)前位置暫停.

(圖片來(lái)自http://nvie.com/posts/iterators-vs-generators/)

需要注意的是, 在協(xié)程中, yield 通常出現(xiàn)在表達(dá)式的右邊(data = yield), 可以產(chǎn)出值, 也可以不產(chǎn)出(如果yield后面沒(méi)有表達(dá)式, 那么會(huì)出None)。 協(xié)程可能會(huì)從調(diào)用方接收數(shù)據(jù), 調(diào)用方把數(shù)據(jù)提供給協(xié)程使用 通過(guò)的是 .send(data) 方法. 而不是 next(…) . 通常, 調(diào)用方會(huì)把值推送給協(xié)程.

生成器調(diào)用方是一直獲取數(shù)據(jù), 而協(xié)程調(diào)用方可以向它傳入數(shù)據(jù), 協(xié)程也不一定要產(chǎn)出數(shù)據(jù)。不管數(shù)據(jù)如何流動(dòng), yield 都是一種流程控制工具, 使用它可以實(shí)現(xiàn)寫(xiě)作式多任務(wù)即,協(xié)程可以把控制器讓步給中心調(diào)度程序, 從而激活其他的協(xié)程.

描述符

描述符是一種創(chuàng)建托管屬性的方法,托管屬性還可用于保護(hù)屬性不受修改,或自動(dòng)更新某個(gè)依賴(lài)屬性的值。描述符是一種在多個(gè)屬性上重復(fù)利用同一個(gè)存取邏輯的方式,能劫持那些本應(yīng)對(duì)于self.__dict__的操作。在其他編程語(yǔ)言中,描述符被稱(chēng)作 setter 和 getter,用于獲得 (Get) 和設(shè)置 (Set) 一個(gè)私有變量。Python 沒(méi)有私有變量的概念,而描述符可以作為一種 Python 的方式來(lái)實(shí)現(xiàn)與私有變量類(lèi)似的功能。

靜態(tài)方法、類(lèi)方法、property都是構(gòu)建描述符的類(lèi)。創(chuàng)建描述符的方式主要有3種:

1.創(chuàng)建一個(gè)類(lèi)并覆蓋任意一個(gè)描述符方法:__set__、__ get__ 和 __delete__。當(dāng)需要某個(gè)描述符跨多個(gè)不同的類(lèi)和屬性的時(shí)候,例如類(lèi)型驗(yàn)證,則使用該方法,例如:

  1. class MyNameDescriptor(object): 
  2.      def __init__(self): 
  3.         self._myname = '' 
  4.  
  5.     def __get__(self, instance, owner):              
  6.         return self._myname    def __set__(self, instance, myname): 
  7.         self._myname = myname.getText()    def __delete__(self, instance): 
  8.         del self._myname 

2.使用屬性類(lèi)型可以更加簡(jiǎn)單、靈活地創(chuàng)建描述符。通過(guò)使用 property(),可以輕松地為任意屬性創(chuàng)建可用的描述符。

  1. class Student(object): 
  2.     def __init__(self): 
  3.         self._sname = '' 
  4.  
  5.     def fget(self): 
  6.         return self._sname    def fset(self, value): 
  7.           self._sname = value.title()    def fdel(self): 
  8.         del self._sname 
  9.     name = property(fget, fset, fdel, "This is the property."

3.使用屬性描述符,它結(jié)合了屬性類(lèi)型方法和 Python裝飾器。

  1. class Student(object): 
  2.         def __init__(self): 
  3.             self._sname = '' 
  4.  
  5.         @property 
  6.         def name(self): 
  7.             return self._sname        @name.setter 
  8.         def name(self, value): 
  9.             self._sname = value.title()        @name.deleter 
  10.         def name(self): 
  11.             del self._sname 

另外,還可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建描述符。 描述符有很多經(jīng)典的應(yīng)用,例如Protobuf。

裝飾器

裝飾器(Decorator)是可調(diào)用的對(duì)象, 其參數(shù)是另一個(gè)函數(shù)(被裝飾的函數(shù)). 裝飾器可能會(huì)處理被裝飾的函數(shù), 然后把它返回, 或者將其替換成另一個(gè)函數(shù)或可調(diào)用對(duì)象.實(shí)際上裝飾器就是一個(gè)高階函數(shù),它接收一個(gè)函數(shù)作為參數(shù),然后返回一個(gè)新函數(shù)。

裝飾器有兩大特征:

  • 把被裝飾的函數(shù)替換成其他函數(shù)
  • 裝飾器在加載模塊時(shí)立即執(zhí)行

python內(nèi)置了三個(gè)用于裝飾方法的函數(shù): property、classmethod 和 staticmethod. 當(dāng)裝飾器不關(guān)心被裝飾函數(shù)的參數(shù),或是被裝飾函數(shù)的參數(shù)多種多樣的時(shí)候,可變參數(shù)非常適合使用。

如果一個(gè)函數(shù)被多個(gè)裝飾器修飾,其實(shí)應(yīng)該是該函數(shù)先被最里面的裝飾器修飾,變成另一個(gè)函數(shù)后,再次被裝飾器修飾。例如:

  1. def second(func): 
  2.      print "running 2nd decorator" 
  3.     def wrapper(): 
  4.         func() 
  5.     return wrapper 
  6.  
  7. def fisrt(func): 
  8.      print "running 1st decorator" 
  9.     def wrapper(): 
  10.         func() 
  11.     return wrapper 
  12.  
  13. @second 
  14. @first 
  15. def myfunction(): 
  16.     print "running myfunction" 

就擴(kuò)展功能而言,裝飾器模式比子類(lèi)化更加靈活。

在設(shè)計(jì)模式中,具體的裝飾器實(shí)例要包裝具體組件的實(shí)例,即裝飾器和所裝飾的組件接口一致,對(duì)使用該組件的客戶(hù)端透明,并將客戶(hù)端的請(qǐng)求轉(zhuǎn)發(fā)給該組件,并且可能在轉(zhuǎn)發(fā)前后執(zhí)行一些額外的操作,透明性使得可以遞歸嵌套多個(gè)裝飾器,從而可以添加任意多個(gè)功能。裝飾器模式和Python裝飾器之間并不是一對(duì)一的等價(jià)關(guān)系,Python裝飾器函數(shù)更為強(qiáng)大,不僅僅可以實(shí)現(xiàn)裝飾器模式。

Lambda

Python 不是純萃的函數(shù)式編程語(yǔ)言,但本身提供了一些函數(shù)式編程的特性,像 map、reduce、filter等都支持函數(shù)作為參數(shù),lambda 函數(shù)函數(shù)則是函數(shù)式編程中的翹楚。

Lambda 函數(shù)又稱(chēng)匿名函數(shù),在某種意義上,return語(yǔ)句隱含在lambda中。和其他很多語(yǔ)言相比,Python 的 lambda 限制很多,最嚴(yán)重的是它只能由一條表達(dá)式組成。lambda規(guī)范必須包含只有一個(gè)表達(dá)式,表達(dá)式必須返回一個(gè)值,由lambda創(chuàng)建一個(gè)匿名函數(shù)隱式地返回表達(dá)式的返回值。

在PySpark 中經(jīng)常會(huì)用到使用Lambda 的操作,例如:

li = [1, 2, 3, 4, 5]

### 列表中國(guó)年的每個(gè)元素加5

map(lambda x: x+5, li) 

### 返回其中的偶數(shù)

filter(lambda x: x % 2 == 0, li) # [2, 4]

### 返回所有元素的乘積

reduce(lambda x, y: x * y, li) 

lambda 可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) 并且返回單個(gè)表達(dá)式的值。

本質(zhì)上,Lambda 函數(shù)是一個(gè)只與輸入?yún)?shù)有關(guān)的抽象代碼樹(shù)片段。在很多語(yǔ)言里,lambda 函數(shù)的調(diào)用會(huì)被套上一層接口,還會(huì)形成閉包,在 lambda 函數(shù)構(gòu)造的同時(shí)就可以完成,之后 lambda 函數(shù)內(nèi)部就是完全靜態(tài)的。而一般的函數(shù)還要加上存儲(chǔ)局部變量的區(qū)域,對(duì)外部環(huán)境的操作,以及命名,大部分語(yǔ)言強(qiáng)制了一般函數(shù)必須與名字綁定。

線程

python是支持多線程的, python的線程就是C語(yǔ)言的一個(gè)pthread,并通過(guò)操作系統(tǒng)調(diào)度算法進(jìn)行調(diào)度。 python 的thread模塊是輕量級(jí)的,而threading模塊是對(duì)thread做了一些封裝,方便使用。threading 經(jīng)常和Queue結(jié)合使用,Queue模塊中提供了同步的、線程安全的隊(duì)列類(lèi),包括FIFO隊(duì)列,LIFO隊(duì)列,和優(yōu)先級(jí)隊(duì)列等。這些隊(duì)列都實(shí)現(xiàn)了鎖,能夠在多線程中直接使用,可以使用隊(duì)列來(lái)實(shí)現(xiàn)線程間的同步。

運(yùn)行線程(線程中包含name屬性)的兩種常用方式如下:

  • 在構(gòu)造函數(shù)中傳入用于線程運(yùn)行的函數(shù)
  • 在子類(lèi)中重寫(xiě)threading.Thread基類(lèi)中run()方法(只需重寫(xiě)init()和run()方法)

實(shí)現(xiàn)一個(gè)守護(hù)線程的簡(jiǎn)單例子如下:

  1. class MyThread(threading.Thread): 
  2.     def run(self): 
  3.         time.sleep(30) 
  4.         print 'thread %s finished.' % self.name 
  5.  
  6. def MyDaemons(): 
  7.     print 'start thread:' 
  8.     for i in range(5): 
  9.         t = MyThread() 
  10.         t.setDaemon(1) 
  11.         t.start() 
  12.     print 'end thread.' 
  13.  
  14. if __name__ == '__main__'
  15.     MyDaemons() 

為了避免線程不同步造成數(shù)據(jù)不同步,可以對(duì)資源進(jìn)行加鎖,也就是訪問(wèn)資源的線程需要獲得鎖,才能訪問(wèn)。threading 模塊中提供了一個(gè) Lock 功能。從Python3.X開(kāi)始,標(biāo)準(zhǔn)庫(kù)為提供了concurrent.futures模塊,其中的ThreadPoolExecutor和ProcessPoolExecutor兩個(gè)類(lèi),實(shí)現(xiàn)了對(duì)threading和multiprocessing的進(jìn)一步抽象,對(duì)編寫(xiě)線程池提供了直接支持。

線程在python 被詬病的是,由于GIL的機(jī)制致使多線程不能利用機(jī)器多核的特性。其實(shí),GIL并不是Python的特性,只是在實(shí)現(xiàn)Python解析器(CPython)的時(shí)侯所引入的。盡管Python完全支持多線程編程, 但解釋器的C語(yǔ)言實(shí)現(xiàn)部分在完全并行執(zhí)行時(shí)并不是線程安全的,解釋器被一個(gè)全局鎖即GIL保護(hù)著,它確保任何時(shí)候都只有一個(gè)Python線程執(zhí)行。

在多線程環(huán)境中,Python 虛擬機(jī)按以下方式執(zhí)行:

設(shè)置GIL

切換到一個(gè)線程去執(zhí)行

運(yùn)行指定的字節(jié)碼指令集合

線程主動(dòng)讓出控制

把線程設(shè)置完睡眠狀態(tài)

解鎖GIL

再次重復(fù)以上步驟

因此,Python的多線程在多核CPU上,只對(duì)于IO密集型計(jì)算產(chǎn)生正面效果;而當(dāng)有至少有一個(gè)CPU密集型線程存在,那么多線程效率會(huì)由于GIL而大幅下降。

GC

Python 中的GC為可配置的垃圾回收器提供了一個(gè)接口。通過(guò)它可以禁用回收器、調(diào)整回收頻率以及設(shè)置debug選項(xiàng),也為用戶(hù)能夠查看那些無(wú)法回收的對(duì)象。

需要了解GC 的兩個(gè)重要函數(shù)是gc.collect() 和 gc.set_threshold()。

gc.collect([generation])觸發(fā)回收行為,返回unreachable object的數(shù)量。generation可選參數(shù),用于指定回收第幾代垃圾回收,由此也可看出python使用的是分代垃圾回收。如果不提供參數(shù),表示對(duì)整個(gè)堆進(jìn)行回收,即Full GC。

gc.set_threshold(threshold0[,threshold1[,threshold2)設(shè)置不同代的回收頻率,GC會(huì)把生命周期不同的對(duì)象分別放到3種代去管理回收,generation 0即傳說(shuō)中的年輕代,generation 1為老年代等。

一般地,通過(guò)比較上次回收之后,比較分配的資源數(shù)和釋放的資源數(shù)來(lái)決定是否啟動(dòng)回收,比如,當(dāng)分配的資源減去釋放的資源數(shù)超過(guò)閾值0時(shí),回收年輕代的對(duì)象。相應(yīng)的,可以通過(guò)gc.get_referents(*objs)得到對(duì)objs任一對(duì)象引用的所有對(duì)象列表。

在要求極限性能的情況下,并確保程序不會(huì)造成對(duì)象循環(huán)引用的時(shí)候,可以禁掉垃圾回收器。通過(guò)使用gc.disable(),可以禁掉自動(dòng)垃圾回收器。

1. gc.enable():激活GC

2. gc.disable():禁用GC

3. gc.isenabled():檢查是否激活

同時(shí),可以用gc.set_debug(gc.DEBUG_LEAK)來(lái)調(diào)試有內(nèi)存泄露的程序。除此之外,還有DEBUG_SAVEALL,該選項(xiàng)能夠讓被回收的對(duì)象保存在gc.garbage里面,以便檢查。

調(diào)試

iPDB是一個(gè)不錯(cuò)的工具,通過(guò) pip install ipdb 安裝該工具,然后在你的代碼中import ipdb; ipdb.set_trace(),然后在程序運(yùn)行時(shí),會(huì)獲得一個(gè)交互式提示,每次執(zhí)行程序的一行并且檢查變量。示例代碼如下:

  1. import ipdb 
  2. ipdb.set_trace() 
  3. ipdb.set_trace(context=5)  # will show five lines of code 
  4.                            # instead of the default three lines 
  5. ipdb.pm() 
  6. ipdb.run('x[0] = 3'
  7. result = ipdb.runcall(function, arg0, arg1, kwarg='foo'
  8. result = ipdb.runeval('f(1,2) - 3'

另外,python內(nèi)置了一個(gè)很好的追蹤模塊,當(dāng)希望搞清其他程序的內(nèi)部構(gòu)造的時(shí)候,這個(gè)功能非常有用。

  1. python -m trace --trace tracing.py                                                                                      

在一些場(chǎng)合,可以使用pycallgraph來(lái)追蹤性能問(wèn)題,它可以創(chuàng)建函數(shù)調(diào)用時(shí)間和次數(shù)的圖表。同時(shí),objgraph對(duì)于查找內(nèi)存泄露非常有用。

當(dāng)然, 在Python 程序員八榮八恥中談到“以打印日志為榮 , 以單步跟蹤為恥“,日志在很多時(shí)候都是調(diào)試的不二法門(mén)。

性能優(yōu)化中的雕蟲(chóng)小技

從時(shí)空的角度看,優(yōu)化通常包含兩方面的內(nèi)容:減小代碼的體積,提高代碼的運(yùn)行效率。

一個(gè)良好的算法往往對(duì)性能起到關(guān)鍵作用,因此性能改進(jìn)的首要點(diǎn)是對(duì)算法的改進(jìn)。在算法的時(shí)間復(fù)雜度排序上依次是:

O(1) -> O(log n) -> O(n) -> O(n log n) -> O(n^2) -> O(n^3) -> O(n^k) -> O(k^n) -> O(n!)

因此能在時(shí)間復(fù)雜度上對(duì)算法進(jìn)行一定的改進(jìn),對(duì)性能的提高不言而喻。

Python 字典中查找操作的復(fù)雜度為O(1),而list 實(shí)際是個(gè)數(shù)組,在list 中查找需要遍歷整個(gè)表,其復(fù)雜度為O(n),因此對(duì)成員的讀操作字典要比列表 更快。在需要多數(shù)據(jù)成員進(jìn)行頻繁訪問(wèn)的時(shí)候,字典是一個(gè)較好的選擇。set的union, intersection,difference操作要比list的迭代要快。因此如果涉及到求list交集,并集或者差的問(wèn)題可以轉(zhuǎn)換為set來(lái)操作。

對(duì)循環(huán)的優(yōu)化所遵循的原則是盡量減少循環(huán)過(guò)程中的計(jì)算量,有多重循環(huán)的盡量將內(nèi)層的計(jì)算提到上一層。 在循環(huán)的時(shí)候使用 xrange 而不是 range,因?yàn)?xrange() 在序列中每次調(diào)用只產(chǎn)生一個(gè)整數(shù)元素。而 range() 將直接返回完整的元素列表,用于循環(huán)時(shí)會(huì)有不必要的開(kāi)銷(xiāo)。另外,while 1 要比 while True 更快。另外,要充分利用Lazy if-evaluation的特性,也就是說(shuō)如果存在條件表達(dá)式if x and y,在 x 為false的情況下y表達(dá)式的值將不再計(jì)算。

python中的字符串對(duì)象是不可改變的,因此對(duì)任何字符串的操作如拼接,修改等都將產(chǎn)生一個(gè)新的字符串對(duì)象,而不是基于原字符串,因此這種持續(xù)的copy會(huì)在一定程度上影響python的性能。因此,在字符串連接的使用盡量使用join()而不是+,當(dāng)對(duì)字符串處理的時(shí)候,首選內(nèi)置函數(shù),對(duì)字符進(jìn)行格式化比直接串聯(lián)讀取要快,盡量使用列表推導(dǎo)和生成器表達(dá)式。

優(yōu)化的前提是需要了解性能瓶頸在什么地方,對(duì)于比較復(fù)雜的代碼可以借助一些工具來(lái)定位,如profile。profile的使用非常簡(jiǎn)單,只需要在使用之前進(jìn)行import即可。對(duì)于profile的剖析數(shù)據(jù),如果以二進(jìn)制文件的時(shí)候保存結(jié)果的時(shí)候,可以通過(guò)pstats模塊進(jìn)行文本報(bào)表分析,它支持多種形式的報(bào)表輸出,是文本界面下一個(gè)較為實(shí)用的工具。

Python性能優(yōu)化除了改進(jìn)算法,選用合適的數(shù)據(jù)結(jié)構(gòu)之外,還可以將關(guān)鍵python代碼部分重寫(xiě)成C擴(kuò)展模塊,或者選用在性能上更為優(yōu)化的解釋器等。

強(qiáng)大的庫(kù)

Python最棒的地方之一,就是大量的第三方庫(kù),覆蓋之廣,令人驚嘆。Python 庫(kù)有一個(gè)缺陷就是默認(rèn)會(huì)進(jìn)行全局安裝。為了使每個(gè)項(xiàng)目都有一個(gè)獨(dú)立的環(huán)境,需要使用工具virtualenv,再用包管理工具pip和virtualenv配合工作。

盡管都可以求助于google或者baidu,但還要不自量力,按照個(gè)人認(rèn)知給出一個(gè)列表,如下:

雖然羅列很多,但終歸是滄海一粟,重要的是,這些都是開(kāi)源的。

不是小結(jié)的小結(jié)

語(yǔ)法數(shù)據(jù),類(lèi)與繼承;

包與模塊,規(guī)范命名;

描述裝飾,迭代生成;

Lambda GC, 并發(fā)線程;

調(diào)試優(yōu)化,類(lèi)庫(kù)無(wú)窮;

人生苦短,Python 編程。

【本文來(lái)自51CTO專(zhuān)欄作者“老曹”的原創(chuàng)文章,作者微信公眾號(hào):喔家ArchiSelf,id:wrieless-com】

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-12-18 15:33:56

Java基礎(chǔ)編程

2017-02-05 16:51:35

網(wǎng)絡(luò)編程網(wǎng)絡(luò)系統(tǒng)

2017-03-27 08:45:47

全棧技術(shù)管理

2023-05-18 09:00:00

人工智能StarCoder編程語(yǔ)言

2012-06-27 09:11:47

2011-04-01 11:16:06

hessian

2012-06-26 10:13:55

2016-12-02 08:55:18

Linux系統(tǒng)

2015-12-23 10:00:04

多種編程語(yǔ)言

2020-07-15 07:45:51

Python開(kāi)發(fā)工具

2020-07-20 08:23:04

Redis分布式系統(tǒng)

2017-04-06 10:27:01

JavaScript基礎(chǔ)Java

2015-09-17 09:36:46

Chrome改變

2017-10-12 18:42:08

前端HTML5基礎(chǔ)知識(shí)

2022-03-18 12:46:56

Go 語(yǔ)言編程語(yǔ)言

2020-10-13 06:56:19

JavaScript異常類(lèi)型開(kāi)發(fā)

2022-01-04 19:28:05

VMware云端虛擬化

2021-06-01 07:16:21

C語(yǔ)言基礎(chǔ)代碼

2020-09-23 13:40:01

信用卡欺詐網(wǎng)絡(luò)釣魚(yú)攻擊

2021-01-26 01:03:36

云原生工具云原生
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

六月丁香婷婷激情| 狠狠色狠狠色综合人人| 大地资源高清在线视频观看| 自拍偷拍亚洲| 亚洲一区二区三区四区在线观看| 国产高清一区二区三区| 久久国产黄色片| 日韩欧美午夜| 精品国产三级a在线观看| 国产 福利 在线| 日日夜夜精品一区| 丁香网亚洲国际| 国产精品电影网站| 九九热精品在线观看| 亚洲资源网站| 91精品国产一区二区三区蜜臀| 亚洲熟妇无码av在线播放| 飘雪影院手机免费高清版在线观看 | 天天摸日日摸狠狠添| 精品国产亚洲一区二区三区在线| 午夜欧美大尺度福利影院在线看| 日韩在线三区| 男人天堂综合网| 蜜臂av日日欢夜夜爽一区| 久久久日本电影| 国产尤物在线播放| 中文精品一区二区| 精品国产污网站| 福利视频999| 欧美成人资源| 午夜久久电影网| 美女在线免费视频| 成年网站在线| 91蝌蚪porny九色| 99三级在线| 在线观看国产黄| 天堂资源在线中文精品| 午夜精品一区二区三区在线视频 | a级大片免费看| 性欧美超级视频| 亚洲成a人片在线观看中文| 一区二区三区四区免费视频| 国产私人尤物无码不卡| av爱爱亚洲一区| av免费观看久久| 国产强伦人妻毛片| 免费观看在线综合色| 国产成人jvid在线播放| 欧美啪啪小视频| 国产欧美高清| 69av在线播放| 午夜精品三级久久久有码| 激情文学一区| 久久免费国产视频| www.天天色| 亚洲国产裸拍裸体视频在线观看乱了中文 | 少妇按摩一区二区三区| 欧美变态网站| 亚洲国产精品va在看黑人| 大尺度在线观看| 日本一区二区三区电影免费观看| 51午夜精品国产| 五月六月丁香婷婷| 国产麻豆一区二区三区| 欧美一级免费观看| 欧美xxxx黑人| 第一区第二区在线| 日韩成人在线视频网站| 野外性满足hd| 精品国产午夜| 中文字幕v亚洲ⅴv天堂| 99热6这里只有精品| 婷婷伊人综合| 欧美高跟鞋交xxxxxhd| 久久精品视频日本| 国产欧美午夜| 日韩美女在线观看一区| a片在线免费观看| 韩日欧美一区二区三区| 99视频日韩| 日韩一区av| 国产拍欧美日韩视频二区| 一本一道久久a久久综合精品| 欧美激情办公室videoshd| 亚洲欧美日本韩国| 国产伦精品一区二区三区四区视频_| 国产在线美女| 欧美性感一区二区三区| 一级片黄色免费| 玖玖玖免费嫩草在线影院一区| 亚洲男人天堂网| 久久99久久99精品免费看小说| 欧美福利电影在线观看| 91av视频在线| 91影院在线播放| www.久久久久久久久| 日本公妇乱淫免费视频一区三区| 久操视频在线免费播放| 午夜精品久久一牛影视| 手机在线成人免费视频| 97久久精品| 亚洲一二三在线| 九九热精彩视频| 日韩**一区毛片| 国产精品夜夜夜一区二区三区尤| 毛片在线能看| 一区二区三区日韩欧美精品| 欧美 日韩精品| 久久久91麻豆精品国产一区| 日韩精品视频免费专区在线播放| 天天爽天天爽天天爽| 中国女人久久久| 成人高h视频在线| 欧美69xxxxx| 亚洲精品欧美二区三区中文字幕| 九色自拍视频在线观看| av日韩一区| 亚洲欧洲偷拍精品| 国产一级在线播放| 韩日欧美一区二区三区| 日韩一区不卡| 在线天堂新版最新版在线8| 4438成人网| 日本美女xxx| 亚洲精品美女91| 亚洲999一在线观看www| 国产综合在线观看| 天天亚洲美女在线视频| 精品人妻一区二区乱码| 99久久99久久精品国产片桃花| 欧美做受高潮电影o| 欧美一级淫片免费视频魅影视频| 亚洲欧洲日本在线| 亚洲色图久久久| 国产精品羞羞答答在线观看| 97热在线精品视频在线观看| 午夜精品久久久久久久91蜜桃| 国产精品福利一区二区三区| 国产精品视频在线观看| 成人免费一级视频| 亚洲激情在线播放| 波多野结衣免费观看| 日韩午夜电影网| 国产精品吊钟奶在线| 青青久草在线| 欧美日韩免费看| 亚洲综合自拍网| 99精品国产一区二区青青牛奶 | 亚洲人吸女人奶水| 亚洲欧美日韩精品一区| 日韩欧美网址| 国产综合在线观看视频| 69av亚洲| 欧美日韩国产一级片| 极品色av影院| 精品在线观看免费| 久久最新免费视频| 亚洲精品一区二区三区中文字幕| 欧美成aaa人片免费看| 国产日产亚洲系列最新| 亚洲免费看黄网站| 一二三区视频在线观看| 国精品一区二区三区| 国产激情一区二区三区在线观看 | 日韩av手机在线观看| 欧美巨乳在线| 欧美性淫爽ww久久久久无| 黄色国产在线播放| 国产一区二区三区精品欧美日韩一区二区三区 | 黄色美女视频在线观看| 精品国产乱码久久| www..com国产| 国产清纯白嫩初高生在线观看91 | 日本在线丨区| 欧美影院精品一区| 久久久久亚洲AV成人| 成人三级在线视频| 国产精品欧美激情在线观看| 欧美日韩在线网站| 91手机在线播放| 色综合亚洲图丝熟| 中文字幕在线日韩| 亚洲国产精彩视频| 色婷婷av一区二区三区gif| 日本午夜精品视频| 成人网男人的天堂| 欧洲熟妇精品视频| 欧美精品激情| 欧美专区一二三| 久久久久九九精品影院| 欧美一级片在线播放| 黄网站在线免费| 日韩av一卡二卡| 国产精品一区二区免费视频| 精品美女久久久久久免费| 欧美另类69xxxx| 成人精品视频一区二区三区尤物| 无码人妻丰满熟妇区毛片18| 欧美 日韩 国产一区二区在线视频| 国产66精品久久久久999小说| xxxxxx欧美| 另类天堂视频在线观看| 男人天堂综合网| 欧美日韩国产大片| 国产亚洲精久久久久久无码77777| 2021国产精品久久精品| 亚洲AV无码久久精品国产一区| 99热这里只有成人精品国产| 曰韩不卡视频| 日本一区福利在线| 97视频热人人精品| 欧美日韩成人影院| 欧美日韩高清在线观看| 日本高清视频www| 6080亚洲精品一区二区| 中文字幕亚洲精品一区| 1区2区3区国产精品| 国产精品熟妇一区二区三区四区 | 污版视频在线观看| 欧美在线亚洲| 亚洲图色在线| 精品人人人人| 亚洲直播在线一区| 国产精品videossex撒尿| 91精品国产免费久久久久久| 免费观看成人高潮| 日韩精品在线观| 国内精品久久久久久久久久久 | 国产精品无码白浆高潮| 欧美日韩中文字幕在线| 午夜精品久久久久99蜜桃最新版 | 久久久久久九九九九| va天堂va亚洲va影视| 国产97色在线| 亚洲欧美一区二区三区| 欧美激情亚洲激情| 自拍视频在线| 亚洲日韩欧美视频| 五月激情婷婷网| 欧美本精品男人aⅴ天堂| 91欧美日韩麻豆精品| 日本二三区不卡| jizz国产在线| 一本大道久久a久久精二百| 亚欧洲精品在线视频| 午夜a成v人精品| 国产中文字字幕乱码无限| 亚洲免费色视频| 麻豆天美蜜桃91| 最好看的中文字幕久久| 精品少妇一区二区三区免费观| 不卡免费追剧大全电视剧网站| 免费欧美一级片| 成人激情小说网站| 日本泡妞xxxx免费视频软件| 韩国欧美国产1区| 能在线观看的av网站| 奇米四色…亚洲| 亚洲成色www.777999| 米奇777在线欧美播放| 蜜臀久久99精品久久久酒店新书| swag国产精品一区二区| 亚洲最大av在线| 精品国产一区二| 国产免费一区二区三区在线观看 | 亚洲AV午夜精品| 欧美一区二区免费| 亚洲精品国偷拍自产在线观看蜜桃 | 日韩日韩日韩日韩日韩| 1024日韩| 99视频精品免费| 日韩av中文在线观看| 黄色a级片免费| 久久久999| 久久久久久久久久毛片| 国产成人精品亚洲777人妖| 麻豆精品国产传媒| 国产精品88888| 黄色国产在线观看| 国产亚洲欧美激情| 在线免费看视频| 一二三四区精品视频| 日韩特黄一级片| 在线一区二区三区做爰视频网站| 青青国产在线视频| 欧美久久一二区| 精品美女www爽爽爽视频| 精品精品国产高清a毛片牛牛| 男女污污视频在线观看| 日韩有码在线电影| 麻豆福利在线观看| 国产精品久久久久久久久久尿 | 精品久久久久久中文字幕大豆网| 日本妇乱大交xxxxx| 91精品国产综合久久久久久| 懂色av一区二区三区四区| 日韩国产欧美精品在线| av电影在线观看| 欧美老女人性生活| √最新版天堂资源网在线| 国产精品美女在线| 亚洲一级大片| 日韩免费三级| 一本色道久久综合亚洲精品不卡 | 久久波多野结衣| 日本一区二区高清不卡| 蜜桃传媒一区二区三区| 日本不卡123| 成人做爰www看视频软件| 国产精品久线在线观看| 日韩 欧美 精品| 欧美性猛交xxxx黑人交| 欧美在线 | 亚洲| 成年人精品视频| 亚洲成人看片| 99国产超薄肉色丝袜交足的后果| 日韩激情图片| 国产美女网站在线观看| 精品一区二区三区的国产在线播放| 人妻巨大乳一二三区| 国产日韩欧美精品电影三级在线| 国产极品国产极品| 欧美日韩国产精品一区| 亚洲乱色熟女一区二区三区| 在线看福利67194| 色一区二区三区| 国产日韩欧美一区二区三区四区| 日本一区二区三区视频| 久久久久久久久久久视频| 成人午夜免费电影| 免费看一级大片| 91国产丝袜在线播放| 日韩欧美电影在线观看| 欧美高清性猛交| 国产精品**亚洲精品| 亚洲精品在线视频观看| 久久中文欧美| 影音先锋人妻啪啪av资源网站| 亚洲国产欧美日韩另类综合 | 多野结衣av一区| 91精品国产91久久久久青草| 久久精品国产亚洲夜色av网站| 男人天堂1024| 国产福利91精品| 久久国产波多野结衣| 欧美一区二区视频在线观看2020| 风间由美一区| 国产精品美女www爽爽爽视频| 蜜臀91精品国产高清在线观看| 久久久久久人妻一区二区三区| 国产精品夜夜嗨| 精品少妇theporn| 日韩视频一区在线观看| 黄色在线视频网站| 97se在线视频| 欧美精品一卡| 麻豆tv在线观看| 婷婷开心激情综合| 免费观看毛片网站| 久久久久久久久久久免费 | 99riav视频在线观看| 久久精品第九区免费观看| 99精品国产福利在线观看免费| 中文字幕三级电影| 日韩欧美成人免费视频| 久久电影中文字幕| 奇米精品一区二区三区在线观看 | 久久久人人人| 娇妻高潮浓精白浆xxⅹ| 黄色精品在线看| 桃花色综合影院| 69av在线视频| 日韩国产一区| 欧美性受xxxxxx黑人xyx性爽| 亚洲欧美一区二区不卡| 国产高潮在线观看| 欧美激情视频一区二区三区不卡| 日本一区福利在线| 欧美日韩怡红院| 成人欧美一区二区三区小说| 欧美熟妇交换久久久久久分类| 国外视频精品毛片| 午夜先锋成人动漫在线| 在线观看免费不卡av| 一区二区三区国产| 欧美xxx.com| 亚洲影院色无极综合| 亚洲激情女人| 特大黑人巨人吊xxxx| 欧美嫩在线观看| 丁香花在线影院| 影音欧美亚洲| 不卡电影免费在线播放一区| 日韩综合在线观看| 不卡毛片在线看| 全球av集中精品导航福利| 国产性xxxx18免费观看视频| 亚洲人成亚洲人成在线观看图片| 国产 日韩 欧美 精品| 国产精品永久免费|