<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 中最快的循環(huán)方式

          2022-05-28 17:26

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

          各種姿勢

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

          1、while 循環(huán)

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

          2、for 循環(huán)

          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(列表推導(dǎo)式)

          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 種方法得到的結(jié)果是一樣的,但是消耗的時間卻各不相同,你可以猜測一下哪一個方法最快,然后看下面代碼的執(zhí)行結(jié)果:

          import?timeit

          def?main():
          ????l_align?=?25
          ????print(f'{"1、while?循環(huán)":<{l_align}}?{timeit.timeit(while_loop,?number=1):.6f}')
          ????print(f"{'2、for?循環(huán)':<{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()

          執(zhí)行結(jié)果如下所示:

          比較快的方式

          for 比 while 塊

          for 和 while 本質(zhì)上在做相同的事情,但是 while 是純 Python 代碼,而 for 是調(diào)用了 C 擴展來對變量進行遞增和邊界檢查,我們知道 CPython 解釋器就是 C 語言編寫的,Python 代碼要比 C 代碼慢,而 for 循環(huán)代表 C,while 循環(huán)代表 Python,因此 for 比 while 快。

          numpy 內(nèi)置的 sum 要比 Python 的 sum 快

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

          交叉使用會更慢

          numpy 的 sum 與 Python 的 range 結(jié)合使用,結(jié)果耗時最長,見方法 7。最好是都使用 numpy 包來完成任務(wù),像方法 6。

          生成器比列表推導(dǎo)式更快

          生成器是惰性的,不會一下子生成 1 億個數(shù)字,而列表推導(dǎo)式會一下子申請全部的數(shù)字,內(nèi)存占有較高不說,還不能有效地利用緩存,因此性能稍差。

          最后

          本文分享了幾種遍歷求和的方法,對比了它們的性能,給出了相應(yīng)的結(jié)論,如果有幫助,還請點個贊哈,如果在看+轉(zhuǎn)發(fā)的話,感激涕零。

          關(guān)注「Python七號」,輕松學(xué)習(xí)一個小技術(shù)。

          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97一区二区三区 | 特级特黄特色大片免费看 | 成人无码人妻 | 爽灬爽灬爽灬高潮无码视频直播 | 吴梦梦无码一区二区三区首发新作 |