首頁 > 後端開發 > Python教學 > Python 中快的循環方式,你知道幾種?

Python 中快的循環方式,你知道幾種?

WBOY
發布: 2023-04-13 09:13:06
轉載
1852 人瀏覽過

大家好,我是 somenzz,今天我們來研究一下 Python 中最快的循環方式。

各種姿勢

比如說有一個簡單的任務,就是從1 累加到1 億,我們至少可以有7 種方法來實現,列舉如下:

1、while 循環

def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s
登入後複製

2、for 循環

def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s
登入後複製

3、sum range

def sum_range(n=100_000_000):
return sum(range(n))
登入後複製

4、sum generator(生成器)

def sum_generator(n=100_000_000):
return sum(i for i in range(n))
登入後複製

5、 sum list comprehension(列表推導式)

def sum_list_comp(n=100_000_000):
return sum([i for i in range(n)])
登入後複製

6、sum numpy

import numpy
def sum_numpy(n=100_000_000):
return numpy.sum(numpy.arange(n, dtype=numpy.int64))
登入後複製

7、sum numpy python range

import numpy
def sum_numpy_python_range(n=100_000_000):
return numpy.sum(range(n))
登入後複製

上述7 種方法得到的結果是一樣的,但是消耗的時間卻各不相同,你可以猜測哪一個方法最快,然後看下面程式碼的執行結果:

import timeit

def main():
l_align = 25
print(f'{"1、while 循环":<{l_align}} {timeit.timeit(while_loop, number=1):.6f}')
print(f"{'2、for 循环':<{l_align}}{timeit.timeit(for_loop, number=1):.6f}")
print(f'{"3、sum range":<{l_align}} {timeit.timeit(sum_range, number=1):.6f}')
print(f'{"4、sum generator":<{l_align}} {timeit.timeit(sum_generator, number=1):.6f}')
print(f'{"5、sum list comprehension":<{l_align}} {timeit.timeit(sum_list_comp, number=1):.6f}')
print(f'{"6、sum numpy":<{l_align}} {timeit.timeit(sum_numpy, number=1):.6f}')
print(f'{"7、sum numpy python range":<{l_align}} {timeit.timeit(sum_numpy_python_range, number=1):.6f}')

if __name__ == '__main__':
main()
登入後複製

執行結果如下所示:

Python 中快的循環方式,你知道幾種?

比較快的方式

for 比while 區塊

for 和while 本質上在做相同的事情,但是while 是純Python 程式碼,而for 是呼叫了C 擴展來對變數進行遞增和邊界檢查,我們知道CPython 解釋器就是C 語言編寫的,Python 程式碼要比C 程式碼慢,而for 迴圈代表C,while 迴圈代表Python,因此for 比while 快。

numpy 內建的sum 比Python 的sum 快

numpy 主要是用C 寫的,相同的功能,肯定是numpy 的快,類似的,numpy 的arange 肯定比Python 的range 快。

交叉使用會更慢

numpy 的 sum 與 Python 的 range 結合使用,結果耗時最長,見方法 7。最好是都使用 numpy 套件來完成任務,像方法 6。

產生器比列表推導式更快

產生器是惰性的,不會一下子產生1 億個數字,而清單推導式會一下子申請全部的數字,記憶體佔有較高不說,還不能有效利用緩存,因此效能稍差。

以上是Python 中快的循環方式,你知道幾種?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板