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

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

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

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

前言

這種觀點在關(guān)于編程語言的討論中經(jīng)常出現(xiàn),經(jīng)常掩蓋了Python的眾多優(yōu)點。5p028資訊網(wǎng)——每日最新資訊28at.com

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

細節(jié)決定成敗。經(jīng)驗豐富的Python開發(fā)者掌握了一系列微妙而強大的技巧,可以顯著提高代碼的性能。5p028資訊網(wǎng)——每日最新資訊28at.com

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

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

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

基本上,Python有兩種字符串連接的方式:5p028資訊網(wǎng)——每日最新資訊28at.com

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

那么哪種方式更快呢?5p028資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,讓我們定義3個不同的函數(shù)來連接相同的字符串:5p028資訊網(wǎng)——每日最新資訊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"

根據(jù)你的第一印象,你認為哪個函數(shù)最快,哪個最慢?5p028資訊網(wǎng)——每日最新資訊28at.com

真正的結(jié)果可能會讓你驚訝:5p028資訊網(wǎng)——每日最新資訊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循環(huán)中逐個添加字符串更快。5p028資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

2. 更快的列表創(chuàng)建:使用“[]”而不是“l(fā)ist()”

創(chuàng)建列表并不是很難的事情。常見的兩種方式是:5p028資訊網(wǎng)——每日最新資訊28at.com

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

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

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

結(jié)果顯示,執(zhí)行l(wèi)ist()函數(shù)比直接使用[]要慢。5p028資訊網(wǎng)——每日最新資訊28at.com

這是因為[]是一種字面量語法,而list()是一個構(gòu)造函數(shù)調(diào)用。調(diào)用函數(shù)無疑需要額外的時間。5p028資訊網(wǎng)——每日最新資訊28at.com

從同樣的邏輯出發(fā),在創(chuàng)建字典時,我們也應(yīng)該使用{}而不是dict()。5p028資訊網(wǎng)——每日最新資訊28at.com

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

成員測試操作的性能在很大程度上依賴于底層數(shù)據(jù)結(jié)構(gòu):5p028資訊網(wǎng)——每日最新資訊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

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

為什么會這樣呢?5p028資訊網(wǎng)——每日最新資訊28at.com

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

這里的關(guān)鍵在于:在編寫程序時要仔細考慮底層數(shù)據(jù)結(jié)構(gòu)。正確利用合適的數(shù)據(jù)結(jié)構(gòu)可以顯著加快代碼的運行速度。5p028資訊網(wǎng)——每日最新資訊28at.com

4. 更快的數(shù)據(jù)生成:使用推導(dǎo)式而不是for循環(huán)

Python中有四種推導(dǎo)式類型:列表推導(dǎo)式、字典推導(dǎo)式、集合推導(dǎo)式和生成器推導(dǎo)式。它們不僅為創(chuàng)建相對數(shù)據(jù)結(jié)構(gòu)提供了更簡潔的語法,而且比使用for循環(huán)更高效,因為它們在Python的C實現(xiàn)中進行了優(yōu)化。5p028資訊網(wǎng)——每日最新資訊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

上述代碼是列表推導(dǎo)式和for循環(huán)之間的簡單速度比較。結(jié)果顯示,列表推導(dǎo)式更快。5p028資訊網(wǎng)——每日最新資訊28at.com

5. 更快的循環(huán):優(yōu)先使用局部變量

在Python中,訪問局部變量比訪問全局變量或?qū)ο蟮膶傩愿臁?span style="display:none">5p028資訊網(wǎng)——每日最新資訊28at.com

以下是一個實例來證明這一點:5p028資訊網(wǎng)——每日最新資訊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的工作原理。直觀地說,當一個函數(shù)被編譯時,其中的局部變量是已知的,但其他外部變量需要時間來檢索。5p028資訊網(wǎng)——每日最新資訊28at.com

這可能是一個小問題,但是當處理大量數(shù)據(jù)時,我們可以利用它來優(yōu)化我們的代碼。5p028資訊網(wǎng)——每日最新資訊28at.com

6. 更快的執(zhí)行速度:優(yōu)先使用內(nèi)置模塊和庫

當工程師們說到Python時,默認情況下指的是CPython。因為CPython是Python語言的默認實現(xiàn),也是使用最廣泛的實現(xiàn)。5p028資訊網(wǎng)——每日最新資訊28at.com

鑒于它的大部分內(nèi)置模塊和庫都是用C語言編寫的,而C語言是一種更快且更底層的語言,因此我們應(yīng)該利用這些內(nèi)置模塊和庫,避免重復(fù)勞動。5p028資訊網(wǎng)——每日最新資訊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

上面的程序比較了兩種統(tǒng)計列表中元素頻率的方法。可以看到,利用collections模塊中內(nèi)置的Counter函數(shù)比自己編寫的for循環(huán)更快、更簡潔、更好。5p028資訊網(wǎng)——每日最新資訊28at.com

7. 更快的函數(shù)調(diào)用:利用緩存裝飾器輕松實現(xiàn)記憶化

緩存是一種常用的技術(shù),用于避免重復(fù)計算并加快程序的運行速度。5p028資訊網(wǎng)——每日最新資訊28at.com

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

例如,下面的代碼將執(zhí)行兩個生成斐波那契數(shù)的函數(shù),一個有緩存裝飾器,而另一個沒有:5p028資訊網(wǎng)——每日最新資訊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)# 測試每個函數(shù)的執(zhí)行時間print(timeit.timeit(lambda: fibonacci(30), number=1))# 0.09499712497927248print(timeit.timeit(lambda: fibonacci_cached(30), number=1))# 6.458023563027382e-06

結(jié)果證明了@functools.cache裝飾器是如何使我們的代碼變得更快的。5p028資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲四色影视在线观看| 国产麻豆综合| 久久综合电影| 欧美成人高清| 欧美日韩久久久久久| 国产精品日韩欧美一区二区三区| 国产人成精品一区二区三| 激情综合在线| 亚洲人成欧美中文字幕| 中国av一区| 久久久精品999| 欧美精品黄色| 国产欧美1区2区3区| 亚洲第一级黄色片| 亚洲天堂男人| 久久综合色一综合色88| 欧美日韩一本到| 国产在线观看一区| 一本到高清视频免费精品| 久久成人这里只有精品| 欧美gay视频激情| 国产精品你懂的| 亚洲国产欧美国产综合一区 | 好吊视频一区二区三区四区| 亚洲福利在线看| 亚洲一区二区日本| 美女免费视频一区| 国产精品永久入口久久久| 亚洲国产美女| 欧美一区二区三区免费视频| 免费观看日韩av| 国产精品一区免费在线观看| 亚洲精品国产品国语在线app| 先锋a资源在线看亚洲| 欧美激情视频在线播放| 国产亚洲一二三区| 一本到12不卡视频在线dvd| 久久久www成人免费无遮挡大片| 欧美日韩一区三区| 在线免费观看成人网| 午夜欧美不卡精品aaaaa| 欧美激情a∨在线视频播放| 国产日韩精品一区| 一区二区三区久久久| 欧美jjzz| 国内外成人在线| 亚洲永久免费| 欧美日韩精品免费| 亚洲国产婷婷香蕉久久久久久99| 久久大综合网| 国产香蕉97碰碰久久人人| 亚洲性视频h| 欧美日本免费| 亚洲激情图片小说视频| 久久久精品国产免大香伊| 久久免费视频网站| 国产精品一区二区黑丝| 一区二区高清视频| 欧美韩日精品| 亚洲国产精品va在线看黑人 | 欧美成人精品在线| 激情久久中文字幕| 欧美在线亚洲在线| 国产精品一区二区三区久久久| 99精品热6080yy久久| 欧美电影在线播放| 亚洲黄色影院| 欧美成人亚洲| 91久久嫩草影院一区二区| 国产精品羞羞答答| 在线视频中文亚洲| 欧美日韩成人一区二区三区| 亚洲日本va午夜在线影院| 免费日韩av电影| 在线成人h网| 老色鬼精品视频在线观看播放| 国内精品美女av在线播放| 久久成人精品电影| 狠狠色狠狠色综合| 久久国产精品色婷婷| 国产一区视频网站| 久久久视频精品| 在线免费日韩片| 欧美+日本+国产+在线a∨观看| 亚洲电影在线| 欧美激情第一页xxx| 亚洲人被黑人高潮完整版| 欧美精品国产精品| 99re8这里有精品热视频免费| 欧美搞黄网站| avtt综合网| 国产精品黄视频| 欧美亚洲系列| 黄色国产精品| 卡一卡二国产精品| 亚洲人成绝费网站色www| 欧美精品二区| 亚洲午夜国产一区99re久久| 国产精品一级二级三级| 久久成人精品| 亚洲欧洲精品一区二区三区| 欧美日韩国产成人在线观看| 亚洲天堂av综合网| 国产午夜精品久久久久久久| 久久久一二三| 亚洲日本欧美日韩高观看| 欧美三级电影网| 欧美一区二区三区免费观看| 在线观看日韩av电影| 欧美精品午夜| 亚洲欧美日韩国产精品| 韩国一区电影| 欧美高清在线精品一区| 在线视频一区观看| 国内成人自拍视频| 欧美激情二区三区| 午夜在线a亚洲v天堂网2018| 黄色精品免费| 欧美日韩一区二区免费视频| 午夜在线精品| 亚洲国产天堂久久国产91| 国产精品久久久久aaaa九色| 久久国产夜色精品鲁鲁99| 亚洲黑丝在线| 国产精品一级久久久| 久久一二三四| 这里只有精品电影| 精品999在线播放| 欧美日韩中文字幕日韩欧美| 久久不见久久见免费视频1| 亚洲精品国产精品国自产在线| 国产精品久久中文| 美女网站在线免费欧美精品| 中日韩美女免费视频网址在线观看 | 亚洲自拍偷拍麻豆| 在线成人激情黄色| 欧美色大人视频| 久久尤物视频| 亚洲欧美成人网| 91久久亚洲| 国产亚洲精久久久久久| 欧美日韩国产小视频在线观看| 久久www成人_看片免费不卡| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产农村妇女毛片精品久久麻豆 | 葵司免费一区二区三区四区五区| 99精品99| 影音先锋久久精品| 国产精品九九久久久久久久| 另类欧美日韩国产在线| 亚洲欧美怡红院| 日韩午夜黄色| 尤物九九久久国产精品的分类| 国产精品进线69影院| 欧美高清一区| 久久影院午夜论| 午夜在线播放视频欧美| 9久草视频在线视频精品| 亚洲国产高清自拍| 国产主播精品| 国产麻豆日韩| 欧美视频国产精品| 国产毛片精品视频| 欧美性猛交99久久久久99按摩| 国产精品久久7| 国产亚洲欧美另类一区二区三区| 亚洲精品视频在线观看免费| 欧美日韩国产美女| 国产精品日韩电影| 亚洲欧洲精品一区二区三区不卡| 篠田优中文在线播放第一区| 欧美日韩直播| 亚洲经典一区| 国产精品久久久久久久久动漫| 99re热这里只有精品免费视频| 国产精品草草| 欧美成人午夜激情视频| 久久狠狠婷婷| 久久精品人人做人人爽| 亚洲美女av在线播放| 国产精品日日做人人爱| 欧美激情视频免费观看| 欧美激情一区二区三区在线视频观看| 久久一区二区三区av| 久久精品视频播放| 亚洲视频免费观看| 国产目拍亚洲精品99久久精品| 欧美在线视频观看| 国产日产欧美精品| 欧美诱惑福利视频| 在线播放豆国产99亚洲| 欧美日韩在线三级| 午夜欧美精品| 亚洲一区免费视频| 最近看过的日韩成人| 国产亚洲欧美一区二区| 国产精品欧美久久| 欧美看片网站| 久久久久久黄| 亚洲欧美另类国产| 国产女主播一区二区| 欧美在线播放一区| 亚洲伊人网站| 免费观看日韩|