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)方式

        2022-06-02 08:33

        ↑?關注 + 星標?,每天學Python新技能

        后臺回復【大禮包】送你Python自學大禮包


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

        各種姿勢

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

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

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

        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í)行結果如下所示:

        比較快的方式

        for 比 while 塊

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

        numpy 內置的 sum 要比 Python 的 sum 快

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

        交叉使用會更慢

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

        生成器比列表推導式更快

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

        最后

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


        1. Shodan — 互聯網上最可怕的搜索引擎

        2. 秋招拿了7個offer,分享一些反思和經驗

        3. 9個很酷的CMD命令,你要知道!


        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            免费看男人添女人无遮挡 | 欧美成人免费影视 | 在公交车上弄到高c小时说r杨震r | 国产成人视频在线播放 | 操逼的视频自创国产 | 国产动漫 久久久精品四季影院 | free性丰满69性欧美 | 91福利网站在线观看 | 日本一 级 黄 色 视频 | 女人操逼毛片 |