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

當(dāng)前位置:首頁 > 科技  > 軟件

加速 Python 代碼的八個(gè)優(yōu)秀實(shí)用技巧

來源: 責(zé)編: 時(shí)間:2024-03-27 17:38:43 168觀看
導(dǎo)讀Python是目前世界上增長(zhǎng)最快的編程語言之一,深受全球開發(fā)者的喜愛。其簡(jiǎn)單語法和豐富的庫使得在各個(gè)領(lǐng)域都能得到廣泛應(yīng)用,比如數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、信號(hào)處理、數(shù)據(jù)可視化等。然而,Python在解決復(fù)雜問題時(shí)可能會(huì)顯得執(zhí)行

Python是目前世界上增長(zhǎng)最快的編程語言之一,深受全球開發(fā)者的喜愛。其簡(jiǎn)單語法和豐富的庫使得在各個(gè)領(lǐng)域都能得到廣泛應(yīng)用,比如數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、信號(hào)處理、數(shù)據(jù)可視化等。然而,Python在解決復(fù)雜問題時(shí)可能會(huì)顯得執(zhí)行速度較慢。因此,本文將探討一些優(yōu)化Python代碼的方法,以加速代碼運(yùn)行。5Da28資訊網(wǎng)——每日最新資訊28at.com

5Da28資訊網(wǎng)——每日最新資訊28at.com

1.使用內(nèi)置函數(shù)和庫

Python標(biāo)準(zhǔn)庫和第三方庫(如NumPy、Pandas等)中的函數(shù)通常是用C或Cython編寫的,運(yùn)行速度遠(yuǎn)超純Python代碼。為了加速Python代碼,可以盡量使用這些庫中的向量化操作代替Python原生循環(huán),特別是在處理數(shù)組和矩陣運(yùn)算時(shí)。5Da28資訊網(wǎng)——每日最新資訊28at.com

舉個(gè)例子,計(jì)算Python列表中每個(gè)元素的平方。5Da28資訊網(wǎng)——每日最新資訊28at.com

import numpy as npimport time# 定義一個(gè)Python列表python_list = [1, 2, 3, 4, 5]# 使用純Python循環(huán)計(jì)算平方的時(shí)間測(cè)試def measure_time(function, argument):    start_time = time.time()    result = function(argument)    end_time = time.time()    return result, end_time - start_time# 定義純Python循環(huán)計(jì)算平方的函數(shù)def square_elements_python(lst):    squared_lst = []    for num in lst:        squared_lst.append(num ** 2)    return squared_lst# 計(jì)算并輸出純Python循環(huán)方法執(zhí)行時(shí)間和結(jié)果python_squares, python_time = measure_time(square_elements_python, python_list)print(f"純Python循環(huán)方法: {python_squares}, Time taken: {python_time} seconds")# 轉(zhuǎn)換為NumPy數(shù)組并使用向量化操作start_time = time.time()numpy_array = np.array(python_list)numpy_squares = numpy_array ** 2end_time = time.time()# 輸出NumPy向量化操作執(zhí)行時(shí)間numpy_time = end_time - start_timeprint(f"NumPy向量化操作: {numpy_squares.tolist()}, Time taken: {numpy_time} seconds")

輸出結(jié)果如下,由此可以看出NumPy的向量化操作在執(zhí)行速度上遠(yuǎn)超純Python循環(huán)法。這是因?yàn)镹umPy內(nèi)部對(duì)數(shù)組操作進(jìn)行了高度優(yōu)化,并利用C語言編寫的底層算法,極大地提高了處理效率。5Da28資訊網(wǎng)——每日最新資訊28at.com

純Python循環(huán)方法: [1, 4, 9, 16, 25], Time taken: 4.5299530029296875e-06 secondsNumPy向量化操作: [1, 4, 9, 16, 25], Time taken: 0.00020122528076171875 seconds

2.Numba JIT編譯

可以使用Numba庫進(jìn)行即時(shí)(JIT)編譯,它可以將指定的Python函數(shù)轉(zhuǎn)換為高效機(jī)器碼,以提升執(zhí)行速度。尤其適用于數(shù)值計(jì)算密集型代碼。5Da28資訊網(wǎng)——每日最新資訊28at.com

例如下面的代碼,sum_array函數(shù)被裝飾器@jit(nopython=True)標(biāo)記后,Numba會(huì)對(duì)其進(jìn)行即時(shí)編譯,將其轉(zhuǎn)換為機(jī)器碼以提升計(jì)算密集型任務(wù)的執(zhí)行速度。5Da28資訊網(wǎng)——每日最新資訊28at.com

import numpy as npfrom numba import jit@jit(nopython=True)def sum_array(arr: np.ndarray) -> float:    result = 0.0    for i in range(arr.shape[0]):        result += arr[i]    return resultarr = np.array([1.0, 2.0, 3.0, 4.0, 5.0])print(sum_array(arr))

3.避免不必要的copy操作

盡可能在原地修改對(duì)象,而不是創(chuàng)建新對(duì)象。例如,使用列表的extend()方法而非"+"操作符進(jìn)行合并,使用numpy數(shù)組的切片賦值而不是重新創(chuàng)建數(shù)組。例如:5Da28資訊網(wǎng)——每日最新資訊28at.com

# 避免:list1 = [1, 2, 3]list2 = [4, 5, 6]new_list = list1 + list2# 推薦:list1 = [1, 2, 3]list2 = [4, 5, 6]# 這里不會(huì)創(chuàng)建新的列表對(duì)象,而是直接在原地?cái)U(kuò)展list1list1.extend(list2)

4.使用生成器表達(dá)式代替列表推導(dǎo)

當(dāng)不需要一次性生成所有結(jié)果,而是逐個(gè)處理時(shí),使用生成器表達(dá)式代替列表推導(dǎo)式可以節(jié)省內(nèi)存,因?yàn)樗粫?huì)立即創(chuàng)建完整列表。5Da28資訊網(wǎng)——每日最新資訊28at.com

例如假設(shè)有一個(gè)包含整數(shù)的列表,我們想要計(jì)算每個(gè)整數(shù)的平方并輸出結(jié)果。使用列表推導(dǎo)式的方法如下:5Da28資訊網(wǎng)——每日最新資訊28at.com

numbers = [1, 2, 3, 4, 5]squared_numbers = [num ** 2 for num in numbers]for squared_num in squared_numbers:    print(squared_num)

輸出結(jié)果為:5Da28資訊網(wǎng)——每日最新資訊28at.com

1491625

但是,如果我們只需要逐個(gè)處理每個(gè)平方數(shù),而不需要將它們存儲(chǔ)在內(nèi)存中,可以使用生成器表達(dá)式代替列表推導(dǎo)式:5Da28資訊網(wǎng)——每日最新資訊28at.com

numbers = [1, 2, 3, 4, 5]squared_numbers = (num ** 2 for num in numbers)for squared_num in squared_numbers:    print(squared_num)

輸出結(jié)果與之前相同,但是使用生成器表達(dá)式可以節(jié)省內(nèi)存,因?yàn)樗粫?huì)一次性生成所有結(jié)果,而是逐個(gè)生成。5Da28資訊網(wǎng)——每日最新資訊28at.com

5.合理利用多線程或多進(jìn)程

對(duì)于CPU密集型任務(wù),Python的多線程受GIL限制,但對(duì)于IO密集型任務(wù)或是使用多核CPU處理CPU密集型任務(wù)時(shí),可以通過multiprocessing庫開啟多進(jìn)程來提升效率。5Da28資訊網(wǎng)——每日最新資訊28at.com

例如如下代碼定義了一個(gè)計(jì)算密集型函數(shù)cpu_bound_task,然后通過multiprocessing.Pool創(chuàng)建了與CPU核心數(shù)量相等的進(jìn)程池,并用pool.map()方法將輸入列表中的任務(wù)分配給這些進(jìn)程進(jìn)行并行處理。5Da28資訊網(wǎng)——每日最新資訊28at.com

這樣,每個(gè)進(jìn)程都有自己的內(nèi)存空間和獨(dú)立GIL,從而可以充分利用多核處理器的能力提高執(zhí)行效率。5Da28資訊網(wǎng)——每日最新資訊28at.com

import multiprocessing as mpdef cpu_bound_task(n):    # 模擬的CPU密集型計(jì)算任務(wù)    result = 0    for i in range(n):        result += i * i    return resultif __name__ == "__main__":    inputs = [1_000_000 + x for x in range(10)]  # 多個(gè)需要處理的數(shù)據(jù)單元    with mp.Pool(processes=mp.cpu_count()) as pool:  # 使用所有可用CPU核心數(shù)        results = pool.map(cpu_bound_task, inputs)  # 將任務(wù)分配到各個(gè)進(jìn)程中并行處理    print(f"Results: {results}")

6.緩存計(jì)算結(jié)果

如果存在重復(fù)計(jì)算的情況,可以使用functools.lru_cache裝飾器來緩存函數(shù)的返回結(jié)果,避免重復(fù)計(jì)算。5Da28資訊網(wǎng)——每日最新資訊28at.com

如下示例使用Python標(biāo)準(zhǔn)庫中的functools.lru_cache裝飾器來緩存函數(shù)的結(jié)果,避免重復(fù)計(jì)算。5Da28資訊網(wǎng)——每日最新資訊28at.com

from functools import lru_cache@lru_cache(maxsize=None)  # 緩存所有結(jié)果,可以根據(jù)實(shí)際情況設(shè)置緩存大小def expensive_computation(x):    # 假設(shè)這是一個(gè)計(jì)算成本很高的函數(shù)    print("Computing...")    return x ** x# 第一次調(diào)用時(shí)會(huì)執(zhí)行計(jì)算result1 = expensive_computation(5)# 第二次調(diào)用時(shí)會(huì)從緩存中獲取結(jié)果,不再執(zhí)行計(jì)算result2 = expensive_computation(5)print(result1 == result2)

第一次調(diào)用expensive_computation(5)時(shí),執(zhí)行計(jì)算并打印"Computing...",然后返回計(jì)算結(jié)果25。第二次調(diào)用時(shí),由于結(jié)果已被緩存,不再執(zhí)行計(jì)算,直接返回上次計(jì)算得到的25。因此,result1 == result2的輸出是True。5Da28資訊網(wǎng)——每日最新資訊28at.com

7.利用異步IO

在處理大量IO操作時(shí),如網(wǎng)絡(luò)請(qǐng)求、文件讀寫等,可以利用asyncio庫實(shí)現(xiàn)異步編程,最大化利用等待IO完成的時(shí)間進(jìn)行其他任務(wù)的處理。5Da28資訊網(wǎng)——每日最新資訊28at.com

例如下面例子使用Python的asyncio庫來并行處理多個(gè)網(wǎng)絡(luò)請(qǐng)求,它會(huì)同時(shí)發(fā)起10個(gè)對(duì)'http://example.com'的異步網(wǎng)絡(luò)請(qǐng)求,并等待所有請(qǐng)求完成后,通過responses變量獲取所有的響應(yīng)結(jié)果,然后逐個(gè)調(diào)用process_response(response)函數(shù)處理這些響應(yīng)。5Da28資訊網(wǎng)——每日最新資訊28at.com

import asyncioasync def fetch(url):    # 異步網(wǎng)絡(luò)請(qǐng)求    response = await asyncio.get_event_loop().run_in_executor(None, fetch_from_network, url)    return responseasync def main():    tasks = [fetch('http://example.com') for _ in range(10)]    responses = await asyncio.gather(*tasks)    for response in responses:        process_response(response)# 啟動(dòng)事件循環(huán)asyncio.run(main())

8.使用Cython或者Python-C接口

對(duì)于計(jì)算密集型的部分代碼,可以使用Cython編寫,將其編譯為C擴(kuò)展模塊,或者直接使用Python的C API編寫擴(kuò)展模塊,這種方式可以大幅提高這部分代碼的執(zhí)行效率。示例如下:5Da28資訊網(wǎng)——每日最新資訊28at.com

首先,安裝Cython并創(chuàng)建.pyx文件:5Da28資訊網(wǎng)——每日最新資訊28at.com

# example_cython.pyxdef cython_power(int x):    return x ** x

然后,編譯為C擴(kuò)展模塊:5Da28資訊網(wǎng)——每日最新資訊28at.com

$ cython example_cython.pyx$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python3.7 -o example_cython.cpython-37m-x86_64-linux-gnu.so example_cython.c

最后,在Python中導(dǎo)入并使用:5Da28資訊網(wǎng)——每日最新資訊28at.com

import example_cython# 使用Cython優(yōu)化后的函數(shù)result = example_cython.cython_power(5)print(result)

通過這種方法,Cython能夠自動(dòng)將Python代碼轉(zhuǎn)化為C代碼,使得原本在Python中執(zhí)行的某些計(jì)算密集型任務(wù)得以顯著加速。5Da28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79836-0.html加速 Python 代碼的八個(gè)優(yōu)秀實(shí)用技巧

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

上一篇: 四個(gè)技巧將 Docker 鏡像體積減小 90%

下一篇: 野心、夢(mèng)想與科幻——淺談外星殖民與軟件工程

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • 紅魔電競(jìng)平板評(píng)測(cè):大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場(chǎng),如今網(wǎng)課的時(shí)代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來了。也就是面對(duì)著這種殘酷的
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對(duì)帶有指定屬性的 HTML 元素設(shè)置樣式。可以為擁有指定屬性的 HTML 元素設(shè)置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡(jiǎn)單而
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(chǔ)(消息堆積)、消費(fèi) 三大塊領(lǐng)域。那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。注意,如果白話中不小心提到相關(guān)代
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時(shí)候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊 了不起學(xué)弟:最近學(xué)習(xí)的還不錯(cuò),每天都在學(xué)習(xí),每天都在進(jìn)步! 了不起:那你最近學(xué)習(xí)的什么呢? 了不起學(xué)弟:最近在學(xué)習(xí)C
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時(shí)間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進(jìn)展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號(hào)榮耀Magi
  • 首發(fā)天璣9200+ iQOO Neo8系列發(fā)布首銷售價(jià)2299元起

    2023年5月23日晚,iQOO Neo8系列正式發(fā)布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強(qiáng)悍登場(chǎng),限時(shí)售價(jià)3099元起;價(jià)位段最強(qiáng)性能手機(jī)iQOO Neo8同期上市
  • 與兆芯合作 聯(lián)想推出全新旗艦版筆記本電腦開天N7系列

    聯(lián)想與兆芯合作推出全新聯(lián)想旗艦版筆記本電腦開天 N7系列。這個(gè)系列采用兆芯KX-6640MA處理器平臺(tái),KX-6640MA 處理器是采用了陸家嘴架構(gòu),16nm 工藝,4 核 4 線
Top 主站蜘蛛池模板: 阜康市| 新沂市| 双桥区| 大宁县| 高平市| 乌兰县| 谢通门县| 仪陇县| 麟游县| 西藏| 恭城| 通江县| 丰城市| 五指山市| 澄江县| 阳春市| 抚顺市| 秦安县| 南召县| 延边| 邹平县| 张掖市| 固阳县| 浦北县| 嘉义县| 和顺县| 耒阳市| 遵义市| 尼勒克县| 大石桥市| 江津市| 天镇县| 阜南县| 西峡县| 汉阴县| 广灵县| 革吉县| 明星| 乐至县| 青阳县| 台安县|