日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

很多小伙伴們總是會吐槽 Python/ target=_blank class=infotextkey>Python 的性能速度慢。但是事實上程序運行速度的快慢都在很大程度上取決于編寫程序的開發人員,以及開發人員的算法能力和對代碼的優化能力。Python 雖然在運行效率上有所欠缺,但是值得一提的是在開發效率方面 Python 卻比其它編程語言高很多。為了彌補 Python 在運行效率上的不足,所以小編在本文為大家介紹提升 Python 代碼性能的技巧。

代碼性能檢測

在對代碼進行優化之前,通常需要檢測是哪些代碼片段拖慢了整個程序的運行速度。在這里筆者推薦三個方法幫助開發者們找出程序的瓶頸,這樣就知道應該把注意力放在哪里。

以一個 Python 實現斐波那契數列的程序為示例:

# 斐波那契數列def Fibonacci: a, b = 0, 1 i = 0 while i < 100: print(b) a, b = b, a+b i += 1 Fibonacci

使用 timeit 庫

timeit 模塊是 Python 的內置模塊。timeit 模塊致力于衡量代碼的性能,模塊內提供了許多個函數和類,以便開發者能夠精確地測量代碼的執行時間。timeit 模塊用法較為簡單,適合用來計算一小段代碼的運行時間。

代碼示例:

import timeit def Fibonacci: a, b = 0, 1 i = 0 while i < 100: print(b) a, b = b, a+b i += 1result = timeit.timeit(Fibonacci, number=5)print(f"Fibonacci函數的運行時間為: {result}")

運行結果:

使用 memory_profiler 庫

memory_profiler 是 Python 的第三方庫(需要使用 pip 命令進行安裝),是一個可根據每行代碼查看內存占用的工具。開發者使用 memory_profiler 庫可以有效的定位到程序中占有內存最多的代碼,以此找到程序運行的瓶頸。

pip 命令安裝:

代碼示例:

from memory_profiler import profile@profiledef Fibonacci: a, b = 0, 1 i = 0 while i < 100: print(b) a, b = b, a+b i += 1Fibonacci

運行結果:

六個技巧,提升Python代碼性能!

使用 line_profiler 庫

和 memory_profiler 類似,line_profiler 也是 Python 的第三方庫,是一個可以逐行參看代碼運行耗時的分析工具。

代碼示例:

from line_profiler import LineProfilerdef Fibonacci: a, b = 0, 1 i = 0 while i < 100: print(b) a, b = b, a+b i += 1lp = LineProfiler lp_wrap = lp(Fibonacci)lp_wrap # 輸出統計數據lp.print_stats

運行結果:

六個技巧,提升Python代碼性能!

接下來就開始介紹提升 Python 代碼性能的六個技巧。

使用內置函數和庫

Python 的內置函數和庫與我們常用的自定義函數、自定義數據類型相比,運行速度會顯得非常快。這主要是因為內置數據類型的底層是使用 C 語言實現的,而 C 語言又是目前為止執行效率最高的高級語言,這是使用 Python 所無法比較的。而且 Python 的開發團隊也對這些內置函數和庫進行了良好的測試和優化。

示例代碼:

my_list = []word_list = "hello,world"for word in word_list: my_list.Append(word.upper)print(my_list)

更好的方法:

word_list = "hello,world"# 使用內置map函數my_list = map(str.upper, word_list)print(list(my_list))

使用內插字符串 f-string

在 Python 程序中,使用支持插值的 f-string 取代 C 風格的格式字符串與 str.format 方法,會使得字符串操作效率得到提高。根據《Effective Python》一書中的介紹, 使用 f-string 是個簡潔而強大的機制,它在簡潔性、可讀性和速度方面都比其他構建字符串的方式要更好。

示例代碼:

places = 3number = 1.23456my_str = "number值和places值分別為{0}和{1}".format(number, places)print(my_str)

更好的方法:

places = 3number = 1.23456my_str = f"number值和places值分別為{number}和{places}"print(my_str)

使用列表推導式

在小片段的 Python 代碼中,使用列表推導式代替循環語句可以使得代碼更加簡潔易讀;在大型項目中,相較于使用循環語句,使用列表推導式的執行效率也會更高。這是因為列表推導式是直接在 C 語言的環境下運行的,所以速度更快,而循環語句的解析執行往往比列表推導式的步驟更多,所以速度就更慢。

示例代碼:

my_list = [] # 計算1到100以內的奇數for i in range(1, 100): if i % 2 == 1: my_list.append(i)print(my_list)

更好的方法:

my_list = [i for i in range(1, 100) if i % 2 == 1]print(my_list)

使用 lru_cache 裝飾器緩存數據

將程序執行時的信息存儲在緩存中可以使程序運行的更加高效。在 Python 中也可以導入functools 庫中的 lru_cache 裝飾器來實現緩存操作,該操作會在內存中存儲特定類的緩存,以此來達到程序更快的驅動速度。

示例代碼:

importtime

defmy_func(x):time.sleep(2) # 模擬程序執行時間returnx

print(my_func(1)) print("=========")print(my_func(1))

更好的方法:

importfunctoolsimporttime

# 最多緩存128個不同的結果@functools.lru_cache(maxsize=2)defmy_func(x):time.sleep(2) # 模擬程序執行時間returnx

print(my_func(1)) print("=========")print(my_func(1)) # 結果已被緩存,無需等待立即返回

針對循環結構的優化

在通常情況下,循環語句在程序中的執行總是會占據大量時間。因此我們開發 Python 程序時都會強調優化其中的循環結構,比方說避免在一個循環中使用點操作符和不必要的重復操作等。

示例代碼:

my_list = [] word_list = ["hello,", "word"]

for word in word_list: new_str = str.lower(word) # 不必要的重復操作和點運算符my_list.append(new_str)

print(my_list)

更好的方法:

my_list = []word_list = ["hello,", "word"]lower = str.lower

for word in word_list:my_list.append(lower(word))

print(my_list)

選擇合適算法和數據結構

提到代碼的運行效率,就不得不提到算法和數據結構能力了。算法也就是程序解決問題的步驟,而數據結構是指數據的存儲和組織。選擇合適的算法和數據結構,可以在很大程度上提升 Python 代碼的運行效率。

示例代碼:

# 在有序數組中,使用二分查找算法查找元素要比使用順序查找算法效率更高defsequential_search(nums,target):fornum innums:ifnum == target:returnnums.index(num)return-1# 返回-1表示沒有找到目標元素

nums = [1, 8, 10, 11, 22]target = 11print(sequential_search(nums, target))

更好的方法:

# 二分查找def binary_search(nums,target):first,last= 0, len(nums) - 1# 定義數組的第一個元素下標和最后一個元素下標whilefirst <= last: #左閉右閉區間mid_index = (first + last) // 2#中間元素的下標值

ifnums[mid_index] < target: first = mid_index + 1elif nums[mid_index] > target:last= mid_index - 1else:returnmid_index return-1

nums = [1, 8, 10, 11, 22]target = 11print(binary_search(nums, target))

好啦,以上就是小編今天分享的六個提高Python代碼性能的技巧,希望對小伙伴們有所幫助!

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文鏈接和本聲明。

原文鏈接:https://blog.csdn.NET/weixin_61361738/article/detAIls/129578460

分享到:
標簽:Python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定