成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

哪種Python循環方式最快?

開發 前端
眾所周知,Python 不是一種執行效率較高的語言。此外在任何語言中,循環都是一種非常消耗時間的操作。假如任意一種簡單的單步操作耗費的時間為 1 個單位,將此操作重復執行上萬次,最終耗費的時間也將增長上萬倍。

眾所周知,Python 不是一種執行效率較高的語言。此外在任何語言中,循環都是一種非常消耗時間的操作。假如任意一種簡單的單步操作耗費的時間為 1 個單位,將此操作重復執行上萬次,最終耗費的時間也將增長上萬倍。

while 和 for 是 Python 中常用的兩種實現循環的關鍵字,它們的運行效率實際上是有差距的。比如下面的測試代碼:?

import timeit


def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s


def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s


def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for loop\t\t', timeit.timeit(for_loop, number=1))


if __name__ == '__main__':
main()
# => while loop 4.718853999860585
# => for loop 3.211570399813354

這是一個簡單的求和操作,計算從 1 到 n 之間所有自然數的總和。可以看到 for? 循環相比 while? 要快 1.5 秒。

其中的差距主要在于兩者的機制不同。

在每次循環中,while? 實際上比 for? 多執行了兩步操作:邊界檢查和變量 i? 的自增。即每進行一次循環,while 都會做一次邊界檢查 (while i < n?)和自增計算(i +=1?)。這兩步操作都是顯式的純 Python 代碼。

for? 循環不需要執行邊界檢查和自增操作,沒有增加顯式的 Python 代碼(純 Python 代碼效率低于底層的 C 代碼)。當循環的次數足夠多,就出現了明顯的效率差距。

可以再增加兩個函數,在 for 循環中加上不必要的邊界檢查和自增計算:

import timeit


def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s


def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s


def for_loop_with_inc(n=100_000_000):
s = 0
for i in range(n):
s += i
i += 1
return s


def for_loop_with_test(n=100_000_000):
s = 0
for i in range(n):
if i < n:
pass
s += i
return s


def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for loop\t\t', timeit.timeit(for_loop, number=1))
print('for loop with increment\t\t',
timeit.timeit(for_loop_with_inc, number=1))
print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=1))


if __name__ == '__main__':
main()
# => while loop 4.718853999860585
# => for loop 3.211570399813354
# => for loop with increment 4.602369500091299
# => for loop with test 4.18337869993411

可以看出,增加的邊界檢查和自增操作確實大大影響了 for? 循環的執行效率。

前面提到過,Python 底層的解釋器和內置函數是用 C 語言實現的。而 C 語言的執行效率遠大于 Python。

對于上面的求等差數列之和的操作,借助于 Python 內置的 sum? 函數,可以獲得遠大于 for? 或 while 循環的執行效率。

import timeit


def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s


def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s


def sum_range(n=100_000_000):
return sum(range(n))


def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for loop\t\t', timeit.timeit(for_loop, number=1))
print('sum range\t\t', timeit.timeit(sum_range, number=1))


if __name__ == '__main__':
main()
# => while loop 4.718853999860585
# => for loop 3.211570399813354
# => sum range 0.8658821999561042

以看到,使用內置函數 sum? 替代循環之后,代碼的執行效率實現了成倍的增長。

內置函數 sum 的累加操作實際上也是一種循環,但它由 C 語言實現,而 for? 循環中的求和操作是由純 Python 代碼 s += i 實現的。C > Python。

再拓展一下思維。小時候都聽說過童年高斯巧妙地計算 1 到 100 之和的故事。1…100 之和等于 (1 + 100) * 50。這個計算方法同樣可以應用到上面的求和操作中。

import timeit


def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s


def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s


def sum_range(n=100_000_000):
return sum(range(n))


def math_sum(n=100_000_000):
return (n * (n - 1)) // 2


def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for loop\t\t', timeit.timeit(for_loop, number=1))
print('sum range\t\t', timeit.timeit(sum_range, number=1))
print('math sum\t\t', timeit.timeit(math_sum, number=1))


if __name__ == '__main__':
main()
# => while loop 4.718853999860585
# => for loop 3.211570399813354
# => sum range 0.8658821999561042
# => math sum 2.400018274784088e-06

最終 math sum 的執行時間約為 2.4e-6,縮短了上百萬倍。這里的思路就是,既然循環的效率低,一段代碼要重復執行上億次。

索性直接不要循環,通過數學公式,把上億次的循環操作變成只有一步操作。效率自然得到了空前的加強。

最后的結論(有點謎語人):

實現循環的最快方式—— —— ——就是不用循環

對于 Python 而言,則盡可能地使用內置函數,將循環中的純 Python 代碼降到最低。

責任編輯:華軒 來源: Python數據科學
相關推薦

2022-08-18 09:51:50

Python代碼循環

2021-12-06 09:40:44

Pythonforwhile

2022-08-16 16:00:05

Python

2022-06-27 07:32:00

JavaArrayList語法糖

2019-09-02 15:12:46

Python 開發數據分析

2023-03-17 11:33:18

數據中心

2021-04-05 14:44:20

JavaScript循環代碼

2022-05-27 06:57:50

Python循環方式生成器

2023-11-01 13:22:15

Java循環

2021-08-26 06:58:14

Http請求url

2022-03-07 07:33:16

線程池Java語言

2019-08-28 07:05:45

2021-10-26 00:01:59

Spring方式代碼

2024-09-26 12:33:29

JSAPI循環

2025-02-21 10:46:16

JSForEachAPI

2020-11-24 05:59:41

容器

2021-04-27 09:00:00

PythonIDE開發

2018-02-28 13:20:40

Python解壓zip

2017-09-12 11:02:51

Python編程語言

2018-07-05 11:05:10

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品高清一区二区三区 | 欧美亚洲综合久久 | 一区二区三区视频在线免费观看 | 二区三区视频 | 中文字幕免费视频 | 精品国产精品国产偷麻豆 | 久久免费大片 | 久久久精品一区二区三区 | 亚洲女人的天堂 | 二区在线视频 | 欧美日韩大片 | 亚洲三区在线观看 | 日韩一区在线观看视频 | 日韩欧美精品一区 | 97av视频| 欧美国产日韩在线观看成人 | 91精品国产综合久久久动漫日韩 | 96久久久久久 | 久久国产精品91 | 精品国产一二三区 | 爱高潮www亚洲精品 中文字幕免费视频 | 久久久精品 | 视频三区 | 欧美一区二区三区视频在线播放 | 国产精品国产a级 | 欧美一区二区三区在线观看 | 欧美夜夜| 国产男女视频网站 | 久久免费看 | 欧美涩涩网 | 国产精品欧美一区二区 | 欧美专区在线观看 | 国产精品一区久久久 | 欧美日韩国产在线观看 | 巨大荫蒂视频欧美另类大 | 一级免费视频 | 欧美久久精品一级黑人c片 91免费在线视频 | 一区二区三区亚洲 | 免费网站国产 | 国产成人福利在线观看 | 久久久99国产精品免费 |