最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文分析提升Python性能的10個智能技巧

 更新時間:2025年11月17日 09:15:39   作者:Dcs  
Python 提供了很多內(nèi)置功能和優(yōu)化技巧,可以顯著提高代碼的運行速度,本文將和大家分享提升 Python 性能的 10 個智能技巧,有需要的小伙伴要了解下

Python 作為一門高效、簡潔且功能強大的編程語言,已經(jīng)廣泛應用于從 Web 開發(fā)到人工智能等多個領(lǐng)域。然而,隨著項目的復雜性增加,性能瓶頸不可避免地浮現(xiàn)。尤其是在數(shù)據(jù)處理、實時系統(tǒng)和高性能計算方面,優(yōu)化 Python 代碼的執(zhí)行效率變得至關(guān)重要。幸運的是,Python 提供了很多內(nèi)置功能和優(yōu)化技巧,可以顯著提高代碼的運行速度。

以下是 10 個經(jīng)過實踐驗證的性能優(yōu)化策略,這些方法不依賴于外部庫,而是通過高效的數(shù)據(jù)結(jié)構(gòu)、低級優(yōu)化和 Python 本身的內(nèi)建功能來加速代碼執(zhí)行。通過這些技巧,你不僅可以在大數(shù)據(jù)集和計算密集型任務(wù)中獲得性能提升,還能在保持代碼簡潔和可讀性的同時,解決性能瓶頸。

技巧 1:使用集合進行成員測試

在處理大規(guī)模數(shù)據(jù)集時,檢查某個元素是否在集合中,使用列表通常效率較低。列表的成員測試(x in some_list)是線性時間復雜度(O(n)),意味著它需要逐個掃描元素。而集合(set)則通過哈希表實現(xiàn),允許常數(shù)時間復雜度(O(1))的查找,效率大幅提升。

big_list = list(range(1000000))
big_set = set(big_list)

start = time.time()
print(999999 in big_list)
print(f"List lookup: {time.time() - start:.6f}s")

start = time.time()
print(999999 in big_set)
print(f"Set lookup: {time.time() - start:.6f}s")

時間測試結(jié)果:

  • 列表查找:約 0.015 秒
  • 集合查找:約 0.00002 秒

如果你的任務(wù)涉及到去重、輸入驗證或交叉引用等操作,集合會比列表更高效。

技巧 2:避免不必要的復制

復制大型對象(如列表、字典或數(shù)組)在時間和內(nèi)存上都是開銷巨大的。每次復制都會創(chuàng)建新的對象,這可能導致內(nèi)存浪費和性能下降,尤其在處理大數(shù)據(jù)集時。盡量使用原地操作而不是復制對象,Python 的許多內(nèi)置數(shù)據(jù)結(jié)構(gòu)都提供了原地操作的方法(如 sort、appendupdate 等)。

numbers = list(range(1000000))

def modify_list(lst):
    lst[0] = 999
    return lst

start = time.time()
result = modify_list(numbers)
print(f"In-place: {time.time() - start:.4f}s")

def copy_list(lst):
    new_lst = lst.copy()
    new_lst[0] = 999
    return new_lst

start = time.time()
result = copy_list(numbers)
print(f"Copy: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • 原地修改:約 0.0001 秒
  • 復制修改:約 0.0100 秒

技巧 3:使用__slots__來提高內(nèi)存效率

Python 類的實例屬性通常存儲在動態(tài)字典(__dict__)中,這為靈活性提供了便利,但也帶來了內(nèi)存開銷。通過使用 __slots__,可以顯式聲明固定的屬性集合,避免創(chuàng)建 __dict__,從而節(jié)省內(nèi)存。

class Point:
    __slots__ = ('x', 'y')

    def __init__(self, x, y):
        self.x = x
        self.y = y

start = time.time()
points = [Point(i, i+1) for i in range(1000000)]
print(f"With slots: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • 使用 __slots__:約 0.1200 秒
  • 不使用 __slots__:約 0.1500 秒

技巧 4:使用math模塊代替操作符

Python 的 math 模塊提供了一些內(nèi)建的函數(shù),這些函數(shù)是用 C 實現(xiàn)的,比直接在 Python 中實現(xiàn)的運算符更加高效。例如,使用 math.sqrt() 通常比使用 ** 0.5 運算符來計算平方根要更快。

import math

numbers = list(range(10000000))

start = time.time()
roots = [math.sqrt(n) for n in numbers]
print(f"Math sqrt: {time.time() - start:.4f}s")

start = time.time()
roots = [n ** 0.5 for n in numbers]
print(f"Operator: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • math.sqrt():約 0.2000 秒
  • ** 0.5:約 0.2500 秒

技巧 5:預分配已知大小的內(nèi)存

Python 在動態(tài)構(gòu)建列表或數(shù)組時,會在后臺進行擴容,每次擴容都會涉及到內(nèi)存分配和數(shù)據(jù)復制。如果你知道數(shù)據(jù)結(jié)構(gòu)的最終大小,預先分配內(nèi)存能顯著提高性能,避免反復擴容。

start = time.time()
result = [0] * 1000000
for i in range(1000000):
    result[i] = i
print(f"Pre-allocated: {time.time() - start:.4f}s")

start = time.time()
result = []
for i in range(1000000):
    result.append(i)
print(f"Dynamic: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • 預分配:約 0.0300 秒
  • 動態(tài)分配:約 0.0400 秒

技巧 6:避免在熱循環(huán)中使用異常處理

異常處理非常強大,但它的開銷也不容小覷。尤其在性能關(guān)鍵的循環(huán)中,頻繁的拋出和捕獲異常會導致堆棧展開和上下文切換,這對性能有很大影響。在這些循環(huán)中,最好通過條件檢查來避免預期之外的錯誤發(fā)生,而不是依賴異常處理。

numbers = list(range(10000000))

start = time.time()
total = 0
for i in numbers:
    if i % 2 != 0:
        total += i // 2
    else:
        total += i
print(f"Conditional: {time.time() - start:.4f}s")

start = time.time()
total = 0
for i in numbers:
    try:
        total += i / (i % 2)
    except ZeroDivisionError:
        total += i
print(f"Exception: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • 條件檢查:約 0.3000 秒
  • 異常處理:約 0.6000 秒

技巧 7:使用局部函數(shù)提高重復邏輯的效率

在函數(shù)中反復使用同一段邏輯時,定義一個局部(嵌套)函數(shù)可以提高性能,因為 Python 會在局部作用域內(nèi)更快地查找變量。

def outer():
    def add_pair(a, b):
        return a + b

    result = 0
    for i in range(10000000):
        result = add_pair(result, i)

    return result

start = time.time()
result = outer()
print(f"Local function: {time.time() - start:.4f}s")

def add_pair(a, b):
    return a + b

start = time.time()
result = 0
for i in range(10000000):
    result = add_pair(result, i)
print(f"Global function: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • 局部函數(shù):約 0.4000 秒
  • 全局函數(shù):約 0.4500 秒

技巧 8:使用itertools進行組合操作

Python 的 itertools 模塊提供了一些高效的函數(shù),適用于排列、組合、笛卡爾積等任務(wù)。這些函數(shù)采用惰性生成方式,能夠在不占用大量內(nèi)存的情況下處理大規(guī)模數(shù)據(jù)。

from itertools import product

items = [1, 2, 3] * 10

start = time.time()
result = list(product(items, repeat=2))
print(f"Itertools: {time.time() - start:.4f}s")

start = time.time()
result = []
for x in items:
    for y in items:
        result.append((x, y))
print(f"Loops: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • itertools.product():約 0.0005 秒
  • 嵌套循環(huán):約 0.0020 秒

技巧 9:使用bisect進行有序列表操作

如果你需要在一個有序列表中進行查找或插入操作,使用 bisect 模塊提供的二分查找方法會比手動實現(xiàn)的

線性查找更加高效。

import bisect

sorted_list = list(range(1000000))

start = time.time()
bisect.insort(sorted_list, 500000)
print(f"Bisect insert: {time.time() - start:.4f}s")

start = time.time()
sorted_list.append(500000)
sorted_list.sort()
print(f"Manual insert: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • bisect.insort():約 0.1000 秒
  • 手動插入:約 0.1500 秒

技巧 10:使用numpy進行數(shù)值計算

對于數(shù)值計算密集型任務(wù),numpy 是一種非常高效的解決方案。相比純 Python 實現(xiàn),numpy 通過優(yōu)化的 C 代碼和向量化操作,能大幅提升計算效率。

import numpy as np

arr = np.arange(1000000)

start = time.time()
result = np.sqrt(arr)
print(f"NumPy: {time.time() - start:.4f}s")

start = time.time()
result = [x ** 0.5 for x in arr]
print(f"List comprehension: {time.time() - start:.4f}s")

時間測試結(jié)果:

  • numpy.sqrt():約 0.2000 秒
  • 列表推導:約 0.4500 秒

結(jié)語

掌握這些 Python 性能優(yōu)化技巧,可以顯著提升你的代碼執(zhí)行效率,特別是在處理大量數(shù)據(jù)或需要高性能計算時。通過了解和運用 Python 內(nèi)置功能和高效的數(shù)據(jù)結(jié)構(gòu),不僅能提升運行速度,還能優(yōu)化代碼的可讀性和可維護性。

到此這篇關(guān)于一文分析提升Python性能的10個智能技巧的文章就介紹到這了,更多相關(guān)Python性能提升技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 迭代器與生成器實例詳解

    Python 迭代器與生成器實例詳解

    這篇文章主要介紹了Python 迭代器與生成器實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 教你一分鐘在win10終端成功安裝Pytorch的方法步驟

    教你一分鐘在win10終端成功安裝Pytorch的方法步驟

    這篇文章主要介紹了教你一分鐘在win10終端成功安裝Pytorch的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Python通過命令開啟http.server服務(wù)器的方法

    Python通過命令開啟http.server服務(wù)器的方法

    這篇文章主要給大家介紹了關(guān)于Python通過命令開啟http.server服務(wù)器的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們隨著小編來一起學習學習吧。
    2017-11-11
  • 總結(jié)python實現(xiàn)父類調(diào)用兩種方法的不同

    總結(jié)python實現(xiàn)父類調(diào)用兩種方法的不同

    最近在工作中實現(xiàn)父類調(diào)用的時候發(fā)現(xiàn)了一個錯誤,然后通過分析實踐總結(jié)出來了,下面這篇文章主要給大家總結(jié)了python中實現(xiàn)父類調(diào)用兩種方法的不同之處,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Python實現(xiàn)多格式文件預覽工具

    Python實現(xiàn)多格式文件預覽工具

    這篇文章主要介紹了如何基于?wxPython?的多格式文件瀏覽與預覽工具,支持文件夾選擇,最近一天文件篩選,圖文文檔預覽,文件復制等多項實用功能,感興趣的可以了解下
    2025-05-05
  • NumPy 如何生成多維數(shù)組的方法

    NumPy 如何生成多維數(shù)組的方法

    這篇文章主要介紹了NumPy 如何生成多維數(shù)組的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 簡單介紹Python的第三方庫yaml

    簡單介紹Python的第三方庫yaml

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python的第三方庫yaml展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼

    python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼

    這篇文章主要介紹了python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實戰(zhàn)

    Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實戰(zhàn)

    這篇文章主要介紹了Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實戰(zhàn),python在網(wǎng)絡(luò)方面封裝一些內(nèi)置模塊,可以用很簡潔的代碼實現(xiàn)端到端的通信,比如HTTP、RPC服務(wù),下文實戰(zhàn)詳情,需要的朋友可以參考一下
    2022-09-09
  • python列表的切片賦值實現(xiàn)

    python列表的切片賦值實現(xiàn)

    Python列表切片賦值是一種將一個列表的特定部分替換為新的元素的操作,本文主要介紹了python列表的切片賦值實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論

西华县| 项城市| 含山县| 宾川县| 科技| 五常市| 宁武县| 漳平市| 通州市| 防城港市| 本溪| 云龙县| 永新县| 津南区| 浮山县| 灌南县| 武宣县| 淄博市| 昌吉市| 丁青县| 武胜县| 翁牛特旗| 海南省| 云林县| 丰原市| 延吉市| 杭锦后旗| 花莲县| 安吉县| 镇巴县| 绥化市| 克东县| 凌云县| 子长县| 天峨县| 盐池县| 阿合奇县| 天门市| 苏尼特右旗| 福安市| 龙山县|