'Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)'

Python 算法 數據結構 XML 編譯器 Python之眼 2019-09-17
"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

利用with可以重寫

"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

利用with可以重寫

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

open的作用使上下文管理器,確保即使出現異常也要在執行完for循環之後關閉文件

與這條語句兼容的其他項目來自Threading模塊的類:

  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoundedSemaphore

此外,如果上下文管理提供上下文變量,可用as子句保存為局部變量

with context_manager as context:
#代碼塊
....

注意,多個上下文管理可以同時使用

with A() as a, B() as b:
....

9.1 作為一個類

任何實現了上下文管理器協議的對象都可以作用於上下文管理器。該協議有兩個特殊方法:

  • enter(self)
  • exit(self,exc_type,exc_value,traceback)
  • 簡而言之,執行with語句的過程如下:
  • __enter__方法。任何返回值都會綁定到指定的as子句
  • 執行內部代碼塊
  • 調用__exit__方法

9.2 作為一個函數----contextlib模塊

標準庫中新增了contextlib模塊,提供了上下文管理器一起使用的輔助函數。他最有用的部分是contextmanager裝飾器。你可以在一個函數裡同時提供__enter__和__exit__兩個部分,中間用yield語句分開

"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

利用with可以重寫

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

open的作用使上下文管理器,確保即使出現異常也要在執行完for循環之後關閉文件

與這條語句兼容的其他項目來自Threading模塊的類:

  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoundedSemaphore

此外,如果上下文管理提供上下文變量,可用as子句保存為局部變量

with context_manager as context:
#代碼塊
....

注意,多個上下文管理可以同時使用

with A() as a, B() as b:
....

9.1 作為一個類

任何實現了上下文管理器協議的對象都可以作用於上下文管理器。該協議有兩個特殊方法:

  • enter(self)
  • exit(self,exc_type,exc_value,traceback)
  • 簡而言之,執行with語句的過程如下:
  • __enter__方法。任何返回值都會綁定到指定的as子句
  • 執行內部代碼塊
  • 調用__exit__方法

9.2 作為一個函數----contextlib模塊

標準庫中新增了contextlib模塊,提供了上下文管理器一起使用的輔助函數。他最有用的部分是contextmanager裝飾器。你可以在一個函數裡同時提供__enter__和__exit__兩個部分,中間用yield語句分開

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

context_illustration提供3個輔助函數:

  • closing(element):返回一個上下文管理器,在退出時會調用鈣元素的close方法。例如,他對處理流的類就很有用
  • supress(*exceptions):他會壓制發生在with語句正文中的特定異常。
  • redirect_stdout(new_target)和redirect_stderr(new_target_:它會將代碼內任何代碼的sys.stdout或sys.stderr輸出重定向到類文件file-like對象的靈異文件。

10、exec,eval和compile

  • exec(object,global,locals):這一函數允許你動態執行python代碼。object應該一個字符串或代碼對象。global和locals參數為所執行的代碼提供全局的和局部的命名空間。global必須是字典,而local可以使任何映射對象。其返回值始終未None
  • eval(expression,globals,locals):這一函數用於對給定代表式進行求值並返回結果。它與exec()類似,但是接受的expression應該是單一python表達式,而不是一系列語句。他返回表達式求值的結果
  • compile(source,filename,mode):這一函數將源代碼編譯成代碼對象或AST對象。要編譯的代碼在source參數中作為字符串提供。filename應該是讀取代碼的文件。

11、list截取

如果要截取最後一個或者最後幾位,建議使用str[0:-1],str[0:-2]

str[:len(str)-1]這種有點多餘

12、常見算法優化例子

  • 1、list
"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

利用with可以重寫

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

open的作用使上下文管理器,確保即使出現異常也要在執行完for循環之後關閉文件

與這條語句兼容的其他項目來自Threading模塊的類:

  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoundedSemaphore

此外,如果上下文管理提供上下文變量,可用as子句保存為局部變量

with context_manager as context:
#代碼塊
....

注意,多個上下文管理可以同時使用

with A() as a, B() as b:
....

9.1 作為一個類

任何實現了上下文管理器協議的對象都可以作用於上下文管理器。該協議有兩個特殊方法:

  • enter(self)
  • exit(self,exc_type,exc_value,traceback)
  • 簡而言之,執行with語句的過程如下:
  • __enter__方法。任何返回值都會綁定到指定的as子句
  • 執行內部代碼塊
  • 調用__exit__方法

9.2 作為一個函數----contextlib模塊

標準庫中新增了contextlib模塊,提供了上下文管理器一起使用的輔助函數。他最有用的部分是contextmanager裝飾器。你可以在一個函數裡同時提供__enter__和__exit__兩個部分,中間用yield語句分開

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

context_illustration提供3個輔助函數:

  • closing(element):返回一個上下文管理器,在退出時會調用鈣元素的close方法。例如,他對處理流的類就很有用
  • supress(*exceptions):他會壓制發生在with語句正文中的特定異常。
  • redirect_stdout(new_target)和redirect_stderr(new_target_:它會將代碼內任何代碼的sys.stdout或sys.stderr輸出重定向到類文件file-like對象的靈異文件。

10、exec,eval和compile

  • exec(object,global,locals):這一函數允許你動態執行python代碼。object應該一個字符串或代碼對象。global和locals參數為所執行的代碼提供全局的和局部的命名空間。global必須是字典,而local可以使任何映射對象。其返回值始終未None
  • eval(expression,globals,locals):這一函數用於對給定代表式進行求值並返回結果。它與exec()類似,但是接受的expression應該是單一python表達式,而不是一系列語句。他返回表達式求值的結果
  • compile(source,filename,mode):這一函數將源代碼編譯成代碼對象或AST對象。要編譯的代碼在source參數中作為字符串提供。filename應該是讀取代碼的文件。

11、list截取

如果要截取最後一個或者最後幾位,建議使用str[0:-1],str[0:-2]

str[:len(str)-1]這種有點多餘

12、常見算法優化例子

  • 1、list
Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

精簡化:

nums = []
for i in range(count):
\tnums.insert(0,i)

感覺這段代碼比上一段代碼更簡潔,很不錯,但是如果你去試試執行速度感覺上一個會比較快。因為第二段代碼完成任務所需要的時間是第一段的200倍

13、隱性平方級操作

lists=[[1,2],[3,4,5],[6]]
sum(lists,[])

sum函數是平方級的運行時間

優化

res = []
for i in lists:
\tres.extend(i)

14、不要對浮點數進行等值比較

可以檢查他們是否接近等於例如

"

6、字典實現原理

CPython中使用偽隨機探測的散列表作為字典底層數據結構。只有可哈希對象才能作為字典的鍵。如果一個對象有一個在整個生命週期都不變的散列值,而且這個值可以與其他對象進行比較,那麼這個對象就是可哈希

Python中所有不可變的內置類型都是可哈希的。可變(列表,字典和集合)是不可哈希的,因此不能作為字典的鍵。可哈希類型協議包括下面兩個方法:

  • hash:這以防範給出dict內部實現需要的散列值(整數)。對於用戶自定義的實例對象,這個值由id()給出
  • eg:比較兩個對象的值是否相等,對於用戶自定義類,除了自身之外,所有的實例對象默認不相等

7、集合

集合是一個魯棒性很好的數據結構,當元素順序的重要性不如元素的唯一性和測試元素是否包含在集合中的效率是,大部分情況下這種數據結構是很有用的

實現細節:

集合被實現為帶有空值的字典,只有鍵才是實際的集合元素。此外,集合還利用這種沒有值的映射做了其他優化。

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

8、XML-RPC協議

是一種輕量級的遠程過程調用協議,通過HTTP使用XML對調用進行編碼。對於簡單的客戶-服務端器交換,通常使用這各種協議而不是SOAP。SOAP提供了列出所有可調函數的頁面(WSDL),XML-RPC與之不同,並沒有可調用函數的目錄

9、上下文管理器With

為了確保即使出現錯誤的情況下也能運行某些清理代碼,try…finally語句是很有用的。以下是使用場景:

  • 關閉一個文件
  • 釋放一個鎖
  • 創建一個臨時代碼補丁

with語句為了這些使用場景的代碼塊包裝一個簡單的方法,即使改代碼引發了異常,你 也可以在其執行前後調用一些代碼。例如處理文件通常採用這種方式:

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

利用with可以重寫

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

open的作用使上下文管理器,確保即使出現異常也要在執行完for循環之後關閉文件

與這條語句兼容的其他項目來自Threading模塊的類:

  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoundedSemaphore

此外,如果上下文管理提供上下文變量,可用as子句保存為局部變量

with context_manager as context:
#代碼塊
....

注意,多個上下文管理可以同時使用

with A() as a, B() as b:
....

9.1 作為一個類

任何實現了上下文管理器協議的對象都可以作用於上下文管理器。該協議有兩個特殊方法:

  • enter(self)
  • exit(self,exc_type,exc_value,traceback)
  • 簡而言之,執行with語句的過程如下:
  • __enter__方法。任何返回值都會綁定到指定的as子句
  • 執行內部代碼塊
  • 調用__exit__方法

9.2 作為一個函數----contextlib模塊

標準庫中新增了contextlib模塊,提供了上下文管理器一起使用的輔助函數。他最有用的部分是contextmanager裝飾器。你可以在一個函數裡同時提供__enter__和__exit__兩個部分,中間用yield語句分開

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

context_illustration提供3個輔助函數:

  • closing(element):返回一個上下文管理器,在退出時會調用鈣元素的close方法。例如,他對處理流的類就很有用
  • supress(*exceptions):他會壓制發生在with語句正文中的特定異常。
  • redirect_stdout(new_target)和redirect_stderr(new_target_:它會將代碼內任何代碼的sys.stdout或sys.stderr輸出重定向到類文件file-like對象的靈異文件。

10、exec,eval和compile

  • exec(object,global,locals):這一函數允許你動態執行python代碼。object應該一個字符串或代碼對象。global和locals參數為所執行的代碼提供全局的和局部的命名空間。global必須是字典,而local可以使任何映射對象。其返回值始終未None
  • eval(expression,globals,locals):這一函數用於對給定代表式進行求值並返回結果。它與exec()類似,但是接受的expression應該是單一python表達式,而不是一系列語句。他返回表達式求值的結果
  • compile(source,filename,mode):這一函數將源代碼編譯成代碼對象或AST對象。要編譯的代碼在source參數中作為字符串提供。filename應該是讀取代碼的文件。

11、list截取

如果要截取最後一個或者最後幾位,建議使用str[0:-1],str[0:-2]

str[:len(str)-1]這種有點多餘

12、常見算法優化例子

  • 1、list
Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

精簡化:

nums = []
for i in range(count):
\tnums.insert(0,i)

感覺這段代碼比上一段代碼更簡潔,很不錯,但是如果你去試試執行速度感覺上一個會比較快。因為第二段代碼完成任務所需要的時間是第一段的200倍

13、隱性平方級操作

lists=[[1,2],[3,4,5],[6]]
sum(lists,[])

sum函數是平方級的運行時間

優化

res = []
for i in lists:
\tres.extend(i)

14、不要對浮點數進行等值比較

可以檢查他們是否接近等於例如

Python的概念化知識、優化技巧和常見算法性能優化(高級下篇)

15、內存洩漏

list = [1,2,3,4,…]

假如有一千萬條數據,使用完成之後,直接list = []。以為這樣做就能清空上一條數據,其實list指向了一個新的地址,一千萬條數據的list依然存在在內存中。儘管python有垃圾回收機制但是如果程序很大,不一定能夠做到及時回收操作,因此一定程度上會造成內存洩漏。

正確的做法是

list.clear()或者del list

最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“01”即可領取。

"

相關推薦

推薦中...