国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

提高 Python 性能的 9 個技巧

與 Java 等語言相比,Python 的性能較差。使用這些技巧來識別和修復(fù) Python 代碼中的問題,以調(diào)整其性能。

優(yōu)化的應(yīng)用程序和網(wǎng)站從構(gòu)建良好的代碼開始。然而,事實是您不需要擔(dān)心 90% 的代碼的性能,對于許多腳本來說可能是 100%。如果 ETL 腳本只運行一次或每晚運行一次,那么它花費一秒或一分鐘并不重要。

不過,如果用戶被迫等待緩慢的應(yīng)用程序完成任務(wù)或網(wǎng)頁顯示結(jié)果,這確實很重要。即便如此,也可能只有代碼庫的一小部分應(yīng)該受到指責(zé)。

最大的性能優(yōu)勢通常來自于編碼甚至開始之前的性能規(guī)劃,而不是在性能緩慢發(fā)生之后。也就是說,應(yīng)用程序開發(fā)人員可以通過多種方式解決代碼性能問題。

以下九個技巧專門針對Python 性能,盡管其中一些技巧也適用于其他語言:

  1. 選擇正確的數(shù)據(jù)類型。

  2. 了解標(biāo)準(zhǔn)函數(shù)、方法和庫。

  3. 查找注重性能的庫。

  4. 理解不同的理解。

  5. 使用生成器函數(shù)、模式和表達式。

  6. 考慮如何處理大數(shù)據(jù)。

  7. 運行配置文件來識別有問題的代碼。

  8. 考慮 CPython 替代品。

  9. 專注于有意義的改進。


文章來源地址http://www.zghlxwxcb.cn/article/364.html

選擇正確的數(shù)據(jù)類型

使用集合的最佳數(shù)據(jù)類型。只要有集合,就可以輕松創(chuàng)建列表。您幾乎可以在任何地方使用列表來代替集合或元組,并且列表的作用遠不止這些。

但是,使用集合或元組進行某些操作會更快,并且這兩種類型通常比列表使用更少的內(nèi)存。要選擇用于集合的最佳類型,您必須首先了解您正在使用的數(shù)據(jù)以及要執(zhí)行的操作。

使用timeit我們可以看到使用集合測試成員資格比使用列表測試要快得多:

> python testtimeit_data_type.py

執(zhí)行時間(帶列表):7.966896300087683秒

執(zhí)行時間(帶設(shè)置):4.913181399926543秒

有時從列表創(chuàng)建臨時集或元組會更快。例如,要查找兩個列表中的公共值,創(chuàng)建兩個集合并使用set junction()可能會更快。這取決于數(shù)據(jù)長度和操作,因此最好使用您期望的數(shù)據(jù)和操作進行測試。

了解標(biāo)準(zhǔn)函數(shù)、方法和庫

了解 Python 的標(biāo)準(zhǔn)功能。模塊經(jīng)過優(yōu)化,幾乎總是比您編寫的代碼更快。許多 Python 函數(shù)很少需要,而且很容易忘記它們的存在。您可能記得set intersection() ,但是如果您需要它們,您會記得Difference()或isdisjoint()嗎?

偶爾瀏覽一下Python 文檔(https://docs.python.org/3/library),或者當(dāng)您遇到性能問題時,了解哪些功能可用。當(dāng)您開始一個新項目時,請仔細閱讀與您自己的工作相關(guān)的那些部分。

如果您只有時間研究一個模塊,請將其設(shè)為itertools——如果您認(rèn)為可以使用它的功能,請考慮安裝more-itertools(https://github.com/more-itertools/more-itertools)(標(biāo)準(zhǔn)庫中沒有)。itertools 的一些功能乍一看可能沒什么用,但如果您正在從事某些工作并記住您在 intertools 中看到的可以提供幫助的內(nèi)容,請不要感到驚訝。即使您沒有看到立即使用,也最好知道有什么可用。

查找注重性能的庫

如果您正在做一些大事,那么很可能有人已經(jīng)創(chuàng)建了一個性能良好的庫來幫助您。您可能需要多個庫來為項目的不同區(qū)域提供功能,其中可能包括以下部分或全部內(nèi)容:

  • 科學(xué)計算。

  • Vision

  • 機器學(xué)習(xí)。

  • 報告。

  • 整合。

注意發(fā)布日期、文檔、支持和社區(qū)。較舊的庫的性能可能不再像以前那樣好,并且您可能需要熟悉給定庫的人員的幫助才能實現(xiàn)所需的性能。

多個庫通常提供相同的功能集。要確定選擇哪一個,請使用適合您需求的數(shù)據(jù)為每個測試創(chuàng)建一個快速測試。您可能會發(fā)現(xiàn)其中一個更容易使用,或者另一個提供更好的開箱即用性能。

熊貓 Pandas

Pandas 是初學(xué)者常用的數(shù)據(jù)分析庫。它值得學(xué)習(xí)的原因有兩個:其他庫使用它或提供兼容的接口,并且您可以找到它的最多幫助和示例。

北極星 Polars

pandas 的替代品(例如 Polars)為許多操作提供了更好的性能。Polars 具有不同的語法,可能會帶來學(xué)習(xí)曲線,但值得一看,以啟動新的大數(shù)據(jù)項目或解決現(xiàn)有項目中的性能問題。

Dask

如果您經(jīng)常處理非常大的數(shù)據(jù),您還應(yīng)該考慮并行計算。這可能需要更改組織數(shù)據(jù)和執(zhí)行計算的方式。它還需要付出大量的努力才能為多核或多臺機器正確編程,這是 Python 與其他語言相比落后的領(lǐng)域。

Dask (https://docs.dask.org/)以及其他庫(例如 Polars)可以處理復(fù)雜性,以充分利用您的核心或機器。如果您熟悉 NumPy 或 pandas,Dask 提供了跨內(nèi)核并行化的最小學(xué)習(xí)曲線。即使您不使用 Dask,了解它提供的功能以及如何使用它也很有幫助,可以幫助您做好處理大數(shù)據(jù)的準(zhǔn)備。

理解不同的理解

這是一個常見的 Python 性能技巧:列表理解將比for循環(huán)更快。

我的測試得出了這些時間,令人印象深刻。

>python timeit_compressive.py

執(zhí)行時間(使用 for):5.180072800023481秒

執(zhí)行時間(使用列表理解):2.5427665999159217秒

但我所做的只是創(chuàng)建一個新列表,其中包含根據(jù)原始值計算的值,因為提示通常顯示以下內(nèi)容:

new_list = [val*2 for val in orig_list]

相關(guān)問題是:我將如何處理該列表?列表推導(dǎo)式的任何實際性能增益可能來自使用可選謂詞(過濾器)、嵌套推導(dǎo)式或生成器表達式而不是列表推導(dǎo)式。

此示例使用嵌套推導(dǎo)式展平矩陣,其性能通常優(yōu)于嵌套循環(huán):

flattened = [x for row in matrix for x in row]

這個使用嵌套理解和過濾器:

names = [

employee.name

for manager in managers

for employee in employees

    if employee.manager_id == manager.id

]

對列表理解的引用是最常見的,但集合理解、字典理解和生成器表達式的 工作方式相同。為您要創(chuàng)建的數(shù)據(jù)類型選擇正確的類型。

以下示例與上面的矩陣示例類似,但返回一個集合而不是列表,這是從列表中獲取唯一值的簡單方法。

unique = {x for row in matrix for x in row}

列表理解和集合理解之間的唯一區(qū)別是集合理解使用大括號 {} 而不是方括號 []。

使用生成器函數(shù)、模式和表達式

生成器是在迭代大型集合時減少內(nèi)存的好方法。如果您使用大型集合,您應(yīng)該知道如何編寫生成器函數(shù)并將生成器模式用于可迭代。

另外,學(xué)習(xí)如何使用生成器表達式,類似于列表推導(dǎo)式。以下代碼對矩陣中所有值的平方求和,而不創(chuàng)建平方列表。

total = sum(x**2 for row in matrix for x in row)

考慮如何處理大數(shù)據(jù)

大數(shù)據(jù)和大文件的性能值得進行完整且單獨的討論。也就是說,在開始大數(shù)據(jù)項目之前需要考慮一些事情。準(zhǔn)備做出以下決定:

  • 選擇一個數(shù)據(jù)庫。

  • 分塊處理數(shù)據(jù)。

  • 確定是否可以忽略某些數(shù)據(jù)。

  • 指定數(shù)據(jù)類型。

  • 使用不同的文件類型。

數(shù)據(jù)庫

對于非常大的數(shù)據(jù),您幾乎肯定會使用專門的庫,例如用于科學(xué)計算的 NumPy、用于數(shù)據(jù)分析的 pandas 或用于并行化和分布式計算的 Dask。搜索互聯(lián)網(wǎng),您可能會找到滿足任何其他大數(shù)據(jù)需求的庫,以及這些需求的替代方案。

塊數(shù)據(jù)

如果您的數(shù)據(jù)太大而無法放入 RAM,您可能需要分塊處理。這種能力內(nèi)置于 Pandas 中,如下所示:

chunk_readers = pandas.read_csv("./data.csv", chunksize=2000)

for chunk in chunk_readers:

    for index, record in chunk.iterrows():

            pprint(record)

其他模塊(例如 Dask 和 Polars)有自己的數(shù)據(jù)分塊或分區(qū)方法。

忽略數(shù)據(jù)

數(shù)據(jù)文件中的數(shù)據(jù)通常比您需要的多得多。Pandas 的read_csv有一個參數(shù)usecols,它可以讓您指定所需的列,并忽略其余的列:

# 只保留命名列

data_frame = pandas.read_csv("./sales.csv", usecols=["product_id", "zip_code"])
#只保留索引為 1,8 和 20 的列

data_frame = pandas.read_csv("./population.csv", usecols=[1,8,20])

這可以顯著減少處理數(shù)據(jù)所需的內(nèi)存。.csv 文件對于 RAM 來說可能太大,但如果您只加載所需的列,則可能會避免分塊。

推導(dǎo)式是從表中刪除列和行的另一種方法,以便您僅使用所需的數(shù)據(jù)。為此,必須讀取整個文件或?qū)φ麄€文件進行分塊,并且原始容器和理解容器必須同時存在。如果需要忽略大量行,最好在迭代塊時刪除行。

指定數(shù)據(jù)類型

另一種節(jié)省內(nèi)存的方法是指定一次數(shù)據(jù)類型并使用所需的最小類型。這還可以提高速度,因為它將數(shù)據(jù)保留為計算最快的格式,并且無需在每次使用數(shù)據(jù)時轉(zhuǎn)換數(shù)據(jù)。例如,一個人的年齡適合八位(0-255),因此我們可以告訴 pandas在該列中使用int8而不是int64 :

data_frame = pandas.read_csv("./people.csv", dtype={"age": "int8"})

通常最好在加載期間設(shè)置數(shù)據(jù)類型,但有時這是不可能的——例如,pandas 無法將非整數(shù)浮點數(shù)(例如 18.5)轉(zhuǎn)換為int8。它可以在加載數(shù)據(jù)框后轉(zhuǎn)換整個列。Pandas 有多種方法來替換或修改列以及處理數(shù)據(jù)中的錯誤:

data_frame['age'] =

            data_frame['age'].astype('int8', errors='ignore')

Dataframe astype和pandas.to_numeric可以執(zhí)行不同類型的轉(zhuǎn)換。如果這些不適用于您的數(shù)據(jù),則可能需要在循環(huán)或理解中實現(xiàn)您自己的轉(zhuǎn)換。

使用不同的文件類型

大多數(shù)情況要求您使用常見的文件類型,例如 .csv。如果您需要在處理過程中保存中間文件,那么使用其他格式會很有幫助。

Apache Arrow 提供 Python 與PyArrow 模塊的綁定。它與 NumPy、pandas 和 Python 對象集成,并提供了以其他文件格式讀取和寫入數(shù)據(jù)集的方法。這些格式更小,PyArrow 可以比 Python .csv 函數(shù)更快地讀取和寫入它們。PyArrow 還具有用于數(shù)據(jù)分析的附加功能,您現(xiàn)在可能不需要這些功能,但至少您知道它可以在將來需要時使用。

如前所述,Pandas 是一個流行的數(shù)據(jù)分析庫。Polars 支持多種文件格式、多核和大于內(nèi)存的數(shù)據(jù)文件。Dask 分區(qū)處理前面提到的大于內(nèi)存數(shù)據(jù)文件的分塊,并且 Dask 最佳實踐在 Parquet 中使用更高效的文件格式。

運行配置文件以識別有問題的代碼

當(dāng)您遇到性能問題時,最好分析您的代碼,而不是猜測優(yōu)化工作的重點。提高性能的一般方法包括以下步驟:

  1. 創(chuàng)建一個比預(yù)期慢的最小的、可重現(xiàn)的用例。

  2. 運行配置文件。

  3. 改進具有最高percall 值的函數(shù)。

  4. 重復(fù)步驟 2,直到達到所需的性能水平。

  5. 運行一個真實的用例(不是最小的)而不進行分析。

  6. 重復(fù)步驟 1,直到達到步驟 5 中所需的性能水平。

憑借經(jīng)驗,您將逐漸了解或至少感受到最佳的聚焦位置。它可能不是具有最高percall值的代碼。有時解決方法是修改循環(huán)內(nèi)的單個計算。其他時候,您可能需要消除循環(huán)或在循環(huán)之外執(zhí)行計算/理解。也許答案是重新組織數(shù)據(jù),或者使用Dask進行并行化。

考慮 CPython 替代品

最常用的 Python 實現(xiàn)是 CPython。所有通用庫都可與 CPython 一起使用,并且它完全實現(xiàn)了語言規(guī)范。

存在其他實現(xiàn),但可能會導(dǎo)致以下問題:

  • Python 代碼在邊緣情況下的行為可能有所不同。

  • C API 模塊可能無法工作或工作速度顯著變慢。

  • 如果您將來必須運行 CPython,則附加功能將無法使用。

盡管存在這些警告,但在某些情況下,替代實現(xiàn)可能是最好的。如果計算嚴(yán)重依賴于 NumPy 等 C API 模塊,那么性能幾乎永遠不會更好??紤] CPython 的替代方案,例如:

  • Jython  在 JVM 中運行并允許與 Java 類和對象輕松集成。

  • IronPython 專為 .NET 設(shè)計,可輕松與 .NET 生態(tài)系統(tǒng)和 C# 庫集成。

  • PyPy 使用即時 (JIT) 編譯器,除非涉及 C API,否則運行速度明顯快于 CPython。

如果您對通用模塊(尤其是 C API 模塊)的需求非常有限,那么這些和其他 CPython 替代方案值得考慮。如果您的應(yīng)用程序?qū)ΜF(xiàn)有 Java 或 .NET 功能有很大依賴性,那么 Jython 和 IronPython 是不錯的選擇。

專注于有意義的改進

還有其他常見建議的提示和技巧可用于提高 Python 性能,例如:

  • 避免點符號,包括Math.sqrt()或myObj.foo()。

  • 使用字符串操作,例如join()方法。

  • 采用多項分配,例如a,b = 1,2。

  • 使用@functools.lru_cache裝飾器。

如果您創(chuàng)建timeit測試,當(dāng)將無效實踐與理想實踐進行比較時,您會看到巨大的改進。(順便說一句,您應(yīng)該學(xué)習(xí)如何使用timeit。)但是,如果同時滿足以下兩個條件,這些技巧只會對您的程序產(chǎn)生明顯的影響:

  1. 編碼已經(jīng)以“錯誤的方式”完成,例如在大循環(huán)或理解中。

  2. 這些操作每次迭代都會花費大量時間。

如果循環(huán)的每次迭代只花費一秒鐘,您可能不會注意到在一個語句中執(zhí)行兩個賦值所節(jié)省的一小部分時間。

考慮一下您的 Python 優(yōu)化工作在哪些方面最重要。如果您關(guān)注可讀性和一致性而不是性能,您可能會獲得更多價值。如果你的項目標(biāo)準(zhǔn)是合并作業(yè)或消除點,那就去做吧。否則,請堅持使用標(biāo)準(zhǔn),直到運行性能測試(timeit或profile)并發(fā)現(xiàn)問題。



到此這篇關(guān)于提高 Python 性能的 9 個技巧的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/364.html

如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系站長進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spark性能優(yōu)化:提高計算速度與資源利用率的實用技巧

    Apache Spark是一個開源的大規(guī)模數(shù)據(jù)處理框架,它可以處理批量數(shù)據(jù)和流式數(shù)據(jù),并提供了一個易用的編程模型。Spark的核心組件是Spark引擎,它負(fù)責(zé)執(zhí)行用戶的計算任務(wù)。在大規(guī)模數(shù)據(jù)處理中,Spark性能優(yōu)化是非常重要的,因為它可以提高計算速度和資源利用率。 在本文中,我

    2024年02月20日
    瀏覽(98)
  • 提高代碼效率的6個Python內(nèi)存優(yōu)化技巧

    提高代碼效率的6個Python內(nèi)存優(yōu)化技巧

    當(dāng)項目變得越來越大時,有效地管理計算資源是一個不可避免的需求。Python與C或c++等低級語言相比,似乎不夠節(jié)省內(nèi)存。 但是其實有許多方法可以顯著優(yōu)化Python程序的內(nèi)存使用,這些方法可能在實際應(yīng)用中并沒有人注意,所以本文將重點介紹Python的內(nèi)置機制,掌握它們將大

    2024年01月18日
    瀏覽(30)
  • 提高 React 性能的技巧

    提高 React 性能的技巧

    1.解決重復(fù)渲染問題 我們大多數(shù)人都知道虛擬 DOM 是如何工作的,但最重要的是檢測何時觸發(fā)樹比較。當(dāng)我們可以跟蹤它時,我們可以控制組件的重新渲染,并最終防止意外的性能流。令人驚訝的是,它并不難捕捉。首先,將 React Devtool 擴展添加到瀏覽器。 然后打開瀏覽器開

    2024年02月09日
    瀏覽(20)
  • MYSQL | 提高SQL性能的技巧

    ??寫SQL是開發(fā)人員的經(jīng)常要面對的,考慮SQL的性能是非常重要的: 提升查詢效率: ??SQL查詢的性能直接影響系統(tǒng)的響應(yīng)時間。優(yōu)化SQL可以減少查詢的執(zhí)行時間,提高系統(tǒng)的響應(yīng)速度,提升用戶體驗。 減少系統(tǒng)負(fù)載: ??性能低下的SQL語句可能會占用大量的系統(tǒng)資源,導(dǎo)

    2024年02月16日
    瀏覽(20)
  • Spring Cache:提高應(yīng)用性能的策略和技巧

    Spring Cache:提高應(yīng)用性能的策略和技巧

    ???? 博主貓頭虎(????)帶您 Go to New World??? ?? 博客首頁 ——????貓頭虎的博客?? ?? 《面試題大全專欄》 ?? 文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍專欄》 ?? 學(xué)會IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎(chǔ)

    2024年02月09日
    瀏覽(28)
  • 深度學(xué)習(xí)模型優(yōu)化:提高訓(xùn)練效率和精度的技巧

    深度學(xué)習(xí)模型優(yōu)化:提高訓(xùn)練效率和精度的技巧

    ??歡迎來到AIGC人工智能專欄~探索Java中的靜態(tài)變量與實例變量 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:AIGC人工智能 ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平有限,如

    2024年02月11日
    瀏覽(28)
  • CSS 提高性能的方法,并提供一些實用的技巧和代碼示例

    CSS 是前端開發(fā)中不可或缺的一部分,它負(fù)責(zé)網(wǎng)頁的樣式和布局。隨著網(wǎng)站規(guī)模和復(fù)雜度的增加,CSS 的性能也變得越來越重要。本文將介紹 CSS 提高性能的方法,并提供一些實用的技巧和代碼示例。 使用壓縮后的 CSS 文件 壓縮 CSS 文件可以減小文件大小,加快加載速度。常見的

    2024年02月06日
    瀏覽(35)
  • 矩陣表達的算法優(yōu)化:線性映射提高性能

    隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)量的增長日益龐大,傳統(tǒng)的算法和計算方法已經(jīng)無法滿足業(yè)務(wù)需求。為了更高效地處理大規(guī)模數(shù)據(jù),人工智能科學(xué)家和計算機科學(xué)家們不斷發(fā)展出各種新的算法和技術(shù)。在這里,我們將關(guān)注矩陣表達的算法優(yōu)化,以及如何通過線性映射提高性能。

    2024年02月21日
    瀏覽(27)
  • web 各個優(yōu)化指標(biāo),提高你得網(wǎng)站性能,以及動畫性能

    名稱 簡寫 含義 優(yōu)化點 造成常見原因 如何改善 Largest Contentful Paint LCP Web 頁主要內(nèi)容的加載速度,衡量加載體驗:為了提供良好的用戶體驗, LCP 應(yīng)該在頁面首次開始加載后的 2.5 秒內(nèi)發(fā)生。 1,img元素 2,image中的svg元素 3,video元素 4,通過url函數(shù)加載背景圖片的元素 5,包含

    2024年02月13日
    瀏覽(21)
  • 優(yōu)化 RDMA 代碼的建議和技巧-rdma性能優(yōu)化技巧-避坑指南

    優(yōu)化 RDMA 代碼的建議和技巧-rdma性能優(yōu)化技巧-避坑指南

    DMA 代表直接內(nèi)存訪問。這意味著應(yīng)用程序可以在 CPU 干預(yù)的情況下直接訪問(讀/寫)主機內(nèi)存。如果您在主機之間執(zhí)行此操作,它將成為遠程直接內(nèi)存訪問 (RDMA) 在閱讀有關(guān) RDMA 的內(nèi)容時,您會注意到一些用于描述其優(yōu)點的術(shù)語。 “零復(fù)制 Zero Copy”、“內(nèi)核繞過 Kernel Bypas

    2024年02月03日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包