日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

掌握這九個技巧,讓Python代碼快如閃電

來源: 責編: 時間:2024-01-26 09:04:23 221觀看
導讀前言這種觀點在關于編程語言的討論中經常出現,經常掩蓋了Python的眾多優點。事實是,如果能以Pythonic的方式編寫Python代碼,它是很快的。細節決定成敗。經驗豐富的Python開發者掌握了一系列微妙而強大的技巧,可以顯著提高

前言

這種觀點在關于編程語言的討論中經常出現,經常掩蓋了Python的眾多優點。xDE28資訊網——每日最新資訊28at.com

事實是,如果能以Pythonic的方式編寫Python代碼,它是很快的。xDE28資訊網——每日最新資訊28at.com

細節決定成敗。經驗豐富的Python開發者掌握了一系列微妙而強大的技巧,可以顯著提高代碼的性能。xDE28資訊網——每日最新資訊28at.com

這些技巧乍看之下似乎微不足道,但它們可以帶來效率的大幅提升。讓我們深入了解其中的9種方法,改變編寫和優化Python代碼的方式。xDE28資訊網——每日最新資訊28at.com

1. 更快的字符串連接:巧妙選擇“join()”或“+”

如果有大量字符串等待處理,字符串連接將成為Python程序的瓶頸。xDE28資訊網——每日最新資訊28at.com

基本上,Python有兩種字符串連接的方式:xDE28資訊網——每日最新資訊28at.com

  1. 使用join()函數將一組字符串合并為一個字符串。
  2. 使用+或+=符號將每個單獨的字符串添加到一個字符串中。

那么哪種方式更快呢?xDE28資訊網——每日最新資訊28at.com

現在,讓我們定義3個不同的函數來連接相同的字符串:xDE28資訊網——每日最新資訊28at.com

mylist = ["Yang", "Zhou", "is", "writing"]# 使用'+'def concat_plus():    result = ""    for word in mylist:        result += word + " "    return result# 使用'join()'def concat_join():    return " ".join(mylist)# 直接連接而不使用列表def concat_directly():    return "Yang" + "Zhou" + "is" + "writing"

根據你的第一印象,你認為哪個函數最快,哪個最慢?xDE28資訊網——每日最新資訊28at.com

真正的結果可能會讓你驚訝:xDE28資訊網——每日最新資訊28at.com

import timeitprint(timeit.timeit(concat_plus, number=10000))# 0.002738415962085128print(timeit.timeit(concat_join, number=10000))# 0.0008482920238748193print(timeit.timeit(concat_directly, number=10000))# 0.00021425005979835987

如上所示,對于連接一組字符串,join()方法比在for循環中逐個添加字符串更快。xDE28資訊網——每日最新資訊28at.com

原因很簡單。一方面,字符串在Python中是不可變的數據,每次+=操作都會創建一個新字符串并復制舊字符串,這在計算上成本是昂貴的。xDE28資訊網——每日最新資訊28at.com

另一方面,.join()方法專門針對連接一系列字符串進行了優化。它會預先計算出所生成字符串的大小,然后一次性創建它。因此,它避免了循環中+=操作帶來的開銷,從而使速度更快。xDE28資訊網——每日最新資訊28at.com

然而,在我們的測試中,速度最快的函數是直接連接字符串文字。它的高速度是由于:xDE28資訊網——每日最新資訊28at.com

  • Python解釋器可以在編譯時優化字符串文字的連接,將它們轉換為一個單獨的字符串文字。這里不涉及循環迭代或函數調用,因此是一種非常高效的操作。
  • 由于所有字符串在編譯時都是已知的,Python可以非常快速地執行此操作,比在循環中進行的運行時連接或經過優化的.join()方法要快得多。

總之,如果需要連接一組字符串,請選擇join()而不是+=。如果想要直接連接字符串,只需使用+即可。xDE28資訊網——每日最新資訊28at.com

2. 更快的列表創建:使用“[]”而不是“list()”

創建列表并不是很難的事情。常見的兩種方式是:xDE28資訊網——每日最新資訊28at.com

  1. 使用list()函數。
  2. 直接使用[]。

讓我們使用一個簡單的代碼片段來測試它們的性能:xDE28資訊網——每日最新資訊28at.com

import timeitprint(timeit.timeit('[]', number=10 ** 7))# 0.1368238340364769print(timeit.timeit(list, number=10 ** 7))# 0.2958830420393497

結果顯示,執行list()函數比直接使用[]要慢。xDE28資訊網——每日最新資訊28at.com

這是因為[]是一種字面量語法,而list()是一個構造函數調用。調用函數無疑需要額外的時間。xDE28資訊網——每日最新資訊28at.com

從同樣的邏輯出發,在創建字典時,我們也應該使用{}而不是dict()。xDE28資訊網——每日最新資訊28at.com

3. 更快的成員測試:使用集合而不是列表

成員測試操作的性能在很大程度上依賴于底層數據結構:xDE28資訊網——每日最新資訊28at.com

import timeitlarge_dataset = range(100000)search_element = 2077large_list = list(large_dataset)large_set = set(large_dataset)def list_membership_test():    return search_element in large_listdef set_membership_test():    return search_element in large_setprint(timeit.timeit(list_membership_test, number=1000))# 0.01112208398990333print(timeit.timeit(set_membership_test, number=1000))# 3.27499583363533e-05

正如上述代碼所示,使用集合進行成員測試比使用列表更快。xDE28資訊網——每日最新資訊28at.com

為什么會這樣呢?xDE28資訊網——每日最新資訊28at.com

  • 在Python的列表中,成員測試(列表中的元素)是通過迭代每個元素直到找到所需的元素或達到列表的末尾來完成。因此,此操作的時間復雜度為O(n)。
  • Python中的集合實現形式為哈希表。在進行成員檢查(集合中的元素)時,Python使用哈希機制,其平均時間復雜度為O(1)。

這里的關鍵在于:在編寫程序時要仔細考慮底層數據結構。正確利用合適的數據結構可以顯著加快代碼的運行速度。xDE28資訊網——每日最新資訊28at.com

4. 更快的數據生成:使用推導式而不是for循環

Python中有四種推導式類型:列表推導式、字典推導式、集合推導式和生成器推導式。它們不僅為創建相對數據結構提供了更簡潔的語法,而且比使用for循環更高效,因為它們在Python的C實現中進行了優化。xDE28資訊網——每日最新資訊28at.com

import timeitdef generate_squares_for_loop():    squares = []    for i in range(1000):        squares.append(i * i)    return squaresdef generate_squares_comprehension():    return [i * i for i in range(1000)]print(timeit.timeit(generate_squares_for_loop, number=10000))# 0.2797503340989351print(timeit.timeit(generate_squares_comprehension, number=10000))# 0.2364629579242319

上述代碼是列表推導式和for循環之間的簡單速度比較。結果顯示,列表推導式更快。xDE28資訊網——每日最新資訊28at.com

5. 更快的循環:優先使用局部變量

在Python中,訪問局部變量比訪問全局變量或對象的屬性更快。xDE28資訊網——每日最新資訊28at.com

以下是一個實例來證明這一點:xDE28資訊網——每日最新資訊28at.com

import timeitclass Example:    def __init__(self):        self.value = 0obj = Example()def test_dot_notation():    for _ in range(1000):        obj.value += 1def test_local_variable():    value = obj.value    for _ in range(1000):        value += 1    obj.value = valueprint(timeit.timeit(test_dot_notation, number=1000))# 0.036605041939765215print(timeit.timeit(test_local_variable, number=1000))# 0.024470250005833805

這就是Python的工作原理。直觀地說,當一個函數被編譯時,其中的局部變量是已知的,但其他外部變量需要時間來檢索。xDE28資訊網——每日最新資訊28at.com

這可能是一個小問題,但是當處理大量數據時,我們可以利用它來優化我們的代碼。xDE28資訊網——每日最新資訊28at.com

6. 更快的執行速度:優先使用內置模塊和庫

當工程師們說到Python時,默認情況下指的是CPython。因為CPython是Python語言的默認實現,也是使用最廣泛的實現。xDE28資訊網——每日最新資訊28at.com

鑒于它的大部分內置模塊和庫都是用C語言編寫的,而C語言是一種更快且更底層的語言,因此我們應該利用這些內置模塊和庫,避免重復勞動。xDE28資訊網——每日最新資訊28at.com

import timeitimport randomfrom collections import Counterdef count_frequency_custom(lst):    frequency = {}    for item in lst:        if item in frequency:            frequency[item] += 1        else:            frequency[item] = 1    return frequencydef count_frequency_builtin(lst):    return Counter(lst)large_list = [random.randint(0, 100) for _ in range(1000)]print(timeit.timeit(lambda: count_frequency_custom(large_list), number=100))# 0.005160166998393834print(timeit.timeit(lambda: count_frequency_builtin(large_list), number=100))# 0.002444291952997446

上面的程序比較了兩種統計列表中元素頻率的方法。可以看到,利用collections模塊中內置的Counter函數比自己編寫的for循環更快、更簡潔、更好。xDE28資訊網——每日最新資訊28at.com

7. 更快的函數調用:利用緩存裝飾器輕松實現記憶化

緩存是一種常用的技術,用于避免重復計算并加快程序的運行速度。xDE28資訊網——每日最新資訊28at.com

幸運的是,在大多數情況下,我們不需要自己編寫緩存處理代碼,因為Python為此提供了一個開箱即用的裝飾器來實現這個目的——@functools.cache。xDE28資訊網——每日最新資訊28at.com

例如,下面的代碼將執行兩個生成斐波那契數的函數,一個有緩存裝飾器,而另一個沒有:xDE28資訊網——每日最新資訊28at.com

import timeitimport functoolsdef fibonacci(n):    if n in (0, 1):        return n    return fibonacci(n - 1) + fibonacci(n - 2)@functools.cachedef fibonacci_cached(n):    if n in (0, 1):        return n    return fibonacci_cached(n - 1) + fibonacci_cached(n - 2)# 測試每個函數的執行時間print(timeit.timeit(lambda: fibonacci(30), number=1))# 0.09499712497927248print(timeit.timeit(lambda: fibonacci_cached(30), number=1))# 6.458023563027382e-06

結果證明了@functools.cache裝飾器是如何使我們的代碼變得更快的。xDE28資訊網——每日最新資訊28at.com

基本的fibonacci函數效率較低,因為在計算fibonacci(30)結果的過程中,它會多次重新計算相同的斐波那契數。xDE28資訊網——每日最新資訊28at.com

而使用緩存的版本要快得多,因為它緩存了之前的計算結果。因此,它只計算每個斐波那契數一次,并且對于相同的參數再次調用時會從緩存中獲取結果。xDE28資訊網——每日最新資訊28at.com

僅僅添加一個內置的裝飾器就可以帶來如此大的改進,這就是Pythonic的意義所在。

本文鏈接:http://www.www897cc.com/showinfo-26-68332-0.html掌握這九個技巧,讓Python代碼快如閃電

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 八個Python開發者必備的PyCharm插件

下一篇: 自動化測試的十大誤區,你知道哪個?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 周至县| 苍山县| 二手房| 土默特左旗| 涟水县| 黑水县| 新宁县| 河东区| 遂宁市| 方正县| 务川| 赣榆县| 武义县| 光山县| 疏勒县| 永济市| 敦化市| 巴中市| 四平市| 瑞金市| 新泰市| 资阳市| 林州市| 五河县| 镇康县| 沙坪坝区| 榆林市| 德保县| 福建省| 龙海市| 鄂温| 邻水| 平江县| 昭苏县| 德格县| 横山县| 莲花县| 曲靖市| 康保县| 中山市| 罗江县|