• 10大python加速技巧


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    简介

    目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们python代码的加速非常重要。本篇文章我们介绍在Python中加速代码的一些技巧。可能不是很多,但在一些大的循环或者函数调用时则能带来巨大的帮助。

    十大Python加速技巧,首先导入numpy

    import numpy as np
    
    
    • 1
    • 2

    1 List Comprehension

    将for的append操作替换为列表中直接产出。这其中加速的主要原因是:

    • 在循环的每次迭代中我们都需要调用append,然后在循环的每次迭代中将其作为函数调用。
    1
    2
    3
    4
    5
    %%time
    numbers = []
    for x in range(10000000):
        if x % 2 == 0: 
            numbers.append(x**2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    CPU times: user 2.33 s, sys: 81.6 ms, total: 2.41 s

    Wall time: 2.43 s

    1
    2
    %%time
    numbers = [x**2 for x in range(10000000) if x % 2 == 0]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    CPU times: user 1.89 s, sys: 93.8 ms, total: 1.99 s

    Wall time: 2 s

    2 使用built-in函数

    python中非常多自带的函数采用了较多的加速,有些是使用C进行了加速。所以会比我们自己写一些for函数等快很多

    1
    2
    3
    4
    %%time
    def builtin_sum():
        return sum(range(100000000)) 
    _ = builtin\_sum() 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    *CPU times: user 1.74 s, sys: 18.8 ms, total: 1.75 s*

    *Wall time: 1.78 s*

    1
    2
    3
    4
    5
    6
    7
    %%time
    def loop\_sum():
     s = 0
        for i in range(100000000):
     s += 1
        return s
    _ = loop\_sum()  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    *CPU times: user 5.44 s, sys: 24.9 ms, total: 5.47 s*

    *Wall time: 5.51 s*

    3 尽可能不调用函数

    在所有的函数语言中,对于函数的调用都是相对更加耗时的,所以在能不适用函数调用的时候尽可能不调用函数,虽然这会使我们的代码更佳简洁易读。

    1
    2
    3
    4
    5
    6
    7
    8
    %%time
    def square(num):
        return num**2
        
    squares = []
    for i in range(1000000):
        squares.append(square(i)) 
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    CPU times: user 421 ms, sys: 23.7 ms, total: 445 ms

    Wall time: 452 ms*

    1
    2
    3
    4
    5
    6
    7
    %%time
    def squares():
     squares = []
        for i in range(1000000):
     squares.append(i**2)
     return squares
    \_ = squares()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    CPU times: user 329 ms, sys: 19.5 ms, total: 348 ms

    Wall time: 358 ms

    4 尽可能使用numpy对数据进行加速

    因为numpy是使用C语言进行过加速的,所以相对于其它很多数据操作是更加快速的。

    1
    2
    3
    4
    %%time
    python\_list = [i for i in range(1000000)]
    
    _ = [i**2 for i in python_list]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    CPU times: user 333 ms, sys: 42.7 ms, total: 376 ms

    Wall time: 383 ms

    1
    2
    3
    %%time
    numpy_array = np.array([i for i in range(1000000)])
    _ = np.square(numpy_array)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    CPU times: user 124 ms, sys: 29.7 ms, total: 153 ms

    Wall time: 155 ms

    5 numpy >= built-in

    1
    2
    3
    4
    5
    %%time
    def numpy_sum():
        return np.sum(np.arange(0,10000000))
    
    _ =numpy\_sum()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    CPU times: user 27.1 ms, sys: 10.7 ms, total: 37.8 ms

    Wall time: 37.1 ms

    1
    2
    3
    4
    %%time
    def builtin_sum():
        return sum(range(10000000)) 
    _ = builtin\_sum()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    CPU times: user 169 ms, sys: 1.17 ms, total: 170 ms

    Wall time: 170 ms

    6 避免Global Variables

    Python中的全局变量不是最好的选择。

    • 通常使用局部变量能更好地跟踪位置和内存使用情况。除了内存使用之外,Python在检索局部变量方面也比全局变量略快。

    因此,在可能的情况下,最好避免使用全局变量。

    7 处理字符串尽可能使用字符串自带的函数

    在处理字符串的时候尽可能使用字符串自带的函数,往往是针对性的优化过,会比我们调用一些其它的工具包来处理特定的数据类型要快很多。

    1
    2
    from collections import Counter
    sequence = "AGAGKTAGAT" * 10000000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1
    2
    3
    4
    5
    %%time
    def count_string(seq):
        return [seq.count("A"), seq.count('G'), seq.count('T'), seq.count('K')]
    
    _ = count\_string(sequence)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    CPU times: user 293 ms, sys: 2.73 ms, total: 296 ms

    Wall time: 296 ms

    1
    2
    3
    4
    5
    %%time
    def count_Counter(seq):
        counter = Counter(seq)
        return [counter["A"], counter["G"], counter["T"], counter["K"]]
    _ = count_Counter(sequence)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    CPU times: user 4.25 s, sys: 30.1 ms, total: 4.28 s

    Wall time: 4.36 s

    8 使用多个变量一起赋值

    1
    2
    3
    4
    5
    %%time
    a = 2
    b = 3
    c = 5
    d = 7
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs

    Wall time: 6.91 µs

    1
    2
    %%time
    a, b, c, d = 2, 3, 5, 7
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs

    Wall time: 5.25 µs

    9 while 1取代while True

    1
    2
    3
    4
    5
    6
    %%time
    cnt  = 0
    while 1:
        cnt  += 1
        if cnt >= 100000:
            break
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    CPU times: user 11.1 ms, sys: 699 µs, total: 11.8 ms

    Wall time: 12.6 ms

    1
    2
    3
    4
    5
    6
    %%time
    cnt  = 0
    while True:
        cnt  += 1
        if cnt >= 100000:
            break
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    CPU times: user 12.8 ms, sys: 365 µs, total: 13.1 ms

    Wall time: 14.2 ms

    10 使用最新的python工具包

    一般后续的新的工具包往往比过往的python工具包要快很多,所以能更新到新的板块则可以尽快更新。

    原创作者:孤飞-博客园
    原文链接:https://blog.csdn.net/ranxi169/p/16585192.html

  • 相关阅读:
    Linux Docker容器配置
    《安富莱嵌入式周报》第324期:单对以太网技术实战,IROS2023迪士尼逼真机器人展示,数百万模具CAD文件下载,闭环步进电机驱动器,CANopen全解析
    算法-合并 K 个升序链表
    WEIXIN day_08(8.25) 学子影院项目实践4
    python中的NaN在质量控制中怎么处理?
    科技云报道:两会热议的数据要素,如何拥抱新技术?
    【一天学awk】基础中的基础
    (原创)关于 获取 java的 文件路径心得
    HarmonyOS应用开发者高级认证
    【云原生】容器编排K8S
  • 原文地址:https://blog.csdn.net/u012804784/article/details/126330451