1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python 中最快的循環(huán)姿勢

        2021-10-30 19:16

        大家好,我是 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ù)。



        瀏覽 12
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产又大又粗又猛又爽的视频 | 在线国产三级 | 日本国产高清视频 | 操逼视频在线观看网站 | 搞黄在线观看 | 波多野结衣视频在线免费观看 | 日本国产在线 | 在线黄片.com | 欧美性爱网在线观看 | 国产日本亚洲香蕉视频 |