关于python性能提升的一些方案(上)

一、函数调用优化(空间跨度,避免访问内存)

1.大数据求和,使用sum

a = range(100000)
%timeit -n 10 sum(a)
10 loops, best of 3: 3.15 ms per loop
%%timeit
   ...: s = 0
   ...: for i in a:
   ...:   s += i
   ...:
100 loops, best of 3: 6.93 ms per loop

2.小数据求和,避免使用sum

%timeit -n 1000 s = a + b + c + d + e + f + g + h + i + j + k # 数据量较小时直接累加更快
1000 loops, best of 3: 571 ns per loop
%timeit -n 1000 s = sum([a,b,c,d,e,f,g,h,i,j,k]) # 小数据量调用 sum 函数,空间效率降低
1000 loops, best of 3: 669 ns per loop

结论:大数据求和sum效率高,小数据求和直接累加效率高。

二、for循环优化之取元素(使用栈或寄存器,避免访问内存)

for lst in [(1, 2, 3), (4, 5, 6)]: # lst 索引需要额外开销
    pass

  应尽量避免使用索引。

for a, b, c in [(1, 2, 3), (4, 5, 6)]: # better
    pass

  相当于给每一个元素直接赋值。

def force():
  lst = range(4)
  for a1 in [1, 2]:
      for a2 in lst:
          for a3 in lst:
             for b1 in lst:
                  for b2 in lst:
                      for b3 in lst:
                          for c1 in lst:
                             for c2 in lst:
                                 for c3 in lst:
                                     for d1 in lst:
                                          yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1)

%%timeit -n 10
for t in force():
    sum([t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]])
10 loops, best of 3: 465 ms per loop
%%timeit -n 10
for a1, a2, a3, b1, b2, b3, c1, c2, c3, d1 in force():
    sum([a1, a2, a3, b1, b2, b3, c1, c2, c3, d1])
10 loops, best of 3: 360 ms per loop

三、生成器优化(查表代替运算)

def force(start, end): # 用于密码暴力破解程序
    for i in range(start, end):
        now = i
        sublst = []
        for j in range(10):
            sublst.append(i % 10) # 除法运算开销较大,比乘法大
            i //= 10
        sublst.reverse()
        yield(tuple(sublst), now)
def force(): # better
  lst = range(5)
  for a1 in [1]:
      for a2 in lst:
          for a3 in lst:
             for b1 in lst:
                  for b2 in lst:
                      for b3 in lst:
                          for c1 in lst:
                             for c2 in lst:
                                 for c3 in lst:
                                     for d1 in lst:
                                          yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1)

  

r0 = [1, 2]  # 可读性与灵活性
r1 = range(10)
r2 = r3 = r4 = r5 = r6 = r7 = r8 = r9 = r1
force = ((a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
            for a0 in r0 for a1 in r1 for a2 in r2 for a3 in r3 for a4 in r4
            for a5 in r5 for a6 in r6 for a7 in r7 for a8 in r8 for a9 in r9)

 四、幂运算优化(pow(x,y,z)) 

def isprime(n):
    if n & 1 == 0:
        return False
    k, q = find_kq(n)
    a = randint(1, n - 1)
    if pow(a, q, n) == 1:  # 比使用 a ** q % n 运算优化数倍
        return True
    for j in range(k):
        if pow(a, pow(2, j) * q, n) == n - 1:  # a **((2 ** j) * q) % n
            return True
    return False

结论:pow(x,y,z)优于x**y%z.

五、除法运算优化

In [1]: from random import getrandbits

In [2]: x = getrandbits(4096)

In [3]: y = getrandbits(2048)

In [4]: %timeit -n 10000 q, r = divmod(x, y)
10000 loops, best of 3: 10.7 us per loop

In [5]: %timeit -n 10000 q, r = x//y, x % y
10000 loops, best of 3: 21.2 us per loop

结论:divmod优于//和%。

六、优化算法时间复杂度

  算法的时间复杂度对程序的执行效率影响最大,在python中可以选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同场景有不同的优化方式,总的来说,一般有分治,分支定界、贪心动态规划等思想。

七、合理使用copy和deepcopy

  对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,这两个函数的不同之处在于deepcopy是递归复制的。效率不同:

In [23]: import copy
In [24]: %timeit -n 10 copy.copy(a)
10 loops, best of 3: 606 ns per loop
In [25]: %timeit -n 10 copy.deepcopy(a)
10 loops, best of 3: 1.17 us per loop

  timeit后面的-n表示运行的次数,后两行对应的是两个timeit的输出,下同。由此可见后者慢一个数量级。

关于copy的一个例子:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

  发生的事情是这样的,[[]]是包含一个空列表的只有一个元素的列表,所以[[]] * 3的所有三个元素都是(指向)这个空列表。修改lists的任何元素都修改这个列表。修改效率高。

八、使用dict或set查找元素

  python 字典和集合都是使用hash表来实现(类似c++标准库unordered_map),查找元素的时间复杂度是O(1)。

In [1]: r = range(10**7)
In [2]: s = set(r) # 占用 588MB 内存
In [3]: d = dict((i, 1) for i in r)  # 占用 716MB 内存
In [4]: %timeit -n 10000 (10**7) - 1 in r
10000 loops, best of 3: 291 ns per loop
In [5]: %timeit -n 10000 (10**7) - 1 in s
10000 loops, best of 3: 121 ns per loop
In [6]: %timeit -n 10000 (10**7) - 1 in d
10000 loops, best of 3: 111 ns per loop

结论:set 的内存占用量最小,dict运行时间最短。

九、合理使用(generator)和yield(节省内存)

In [1]: %timeit -n 10 a = (i for i in range(10**7))  # 生成器通常遍历更高效
10 loops, best of 3: 933 ns per loop
In [2]: %timeit -n 10 a = [i for i in range(10**7)]
10 loops, best of 3: 916 ms per loop
In [1]: %timeit -n 10 for x in (i for i in range(10**7)): pass
10 loops, best of 3: 749 ms per loop
In [2]: %timeit -n 10 for x in [i for i in range(10**7)]: pass
10 loops, best of 3: 1.05 s per loop

  结论:尽量使用生成器去遍历。

时间: 2024-10-22 01:30:58

关于python性能提升的一些方案(上)的相关文章

Web 应用性能提升 10 倍的 10 个建议

转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计信息). 我们现在所处的时代要求一直在线和互联互通,这意味着用户对性能有更高的期望.如果网站响应不及时,或者应用有明显的延迟,用户很快就会跑到竞争者那边去. 例如,Amazon 十年前做的一项研究表明,网页加载时间减少 100 毫秒,收入就会增加  1%.最近另一项研究凸显了一个事实,就是有一半以上

深度学习性能提升的诀窍

深度学习性能提升的诀窍[转载] 原文: How To Improve Deep Learning Performance 作者: Jason Brownlee 提升算法性能的想法 这个列表并不完整,却是很好的出发点.我的目的是给大家抛出一些想法供大家尝试,或许有那么一两个有效的方法.往往只需要尝试一个想法就能得到提升.我把这个列表划分为四块: · 从数据上提升性能 · 从算法上提升性能 · 从算法调优上提升性能 · 从模型融合上提升性能 性能提升的力度按上表的顺序从上到下依次递减.举个例子,新的

性能提升 25 倍:Rust 有望取代 C 和 C++,成为机器学习首选 Python 后端

https://www.infoq.cn/article/dgKDBiPl7KID0dyaE7Wl 在机器学习开发领域,如果我们纵观全局,撇除所有微小的细节,那么就可以提炼出机器学习开发中的两大不变步骤:模型训练和预测(或推断).如今,机器学习的首选语言是Python(除非你的工作环境有一些不寻常的约束才会有所不同),而这篇文章会带你走过一段新的旅程.希望当你看到最后会发现,使用 Rust 作为训练后端和部署平台的主意并不像听起来那样疯狂或令人困惑(除了标题提到的性能提升外,这种做法的好处其实还

Ntop性能提升方案

Ntop性能提升方案 Ntop是一款Linux下常见的开源监控软件,它可以监测的数据包括:网络流量.使用协议.系统负载.端口情况.数据包发送时间等.正常情况下它工作的时候就像一部被动声纳,默默的接收看来自网络的各种信息,通过对这些数据的分析,网络管理员可以深入了解网络当前的运行状况,不过一旦超过Ntop数据包的处理能力,Ntop随即出现性能问题,从而导致Ntop无法准确分析网络流量和各种数据,对网络管理造成影响.下文介绍了一种提高Ntop性能的方法. 通常Ntop的抓包分析功能,是通过Ntop自

谷歌推出 Python 性能加速方案

https://codingpy.com/article/grumpy-boosts-python-with-go/ 昨天,谷歌发布了一个 Python 性能加速方案 —— Grumpy,可以将 Python 代码转译(transcompile)为 Go 源代码. 昨天,谷歌发布了一个 Python 性能加速方案 —— Grumpy,可以将 Python 代码转译(transcompile)为 Go 源代码,然后再编译为 Native Code.目前在 Github 上已经获得了 3000+ s

Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案

1. 业务场景 android+webview h5 css背景图性能提升1 2. 根据标准,到目前为止,H5 一共有6种缓存机制,有些是之前已有,有些是 H5 才新加入的.1 2.1. 各种方案的比较,如下图2 3. Attilax的解决之道 file 缓存+http3 3.1. 图片的下载3 3.2. Jsbridge 4android5 3.3. http协议6 4. 参考8 1. 业务场景 android+webview h5 css背景图性能提升 图片的缓存大概儿需要500m的规模..

利用 NGINX 最大化 Python 性能,第一部分:Web 服务和缓存

[编者按]本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能.本文系国内 ITOM 管理平台 OneAPM 编译呈现. Python 的著名之处在于使用简单方便,软件开发简单,而且据说运行性能优于其它脚本语言.(虽然最新版本的 PHP.PHP 7 可能会与它展开激烈竞争.) 所有人都希望自己的网站和应用程序运行得更快一些.但是,每个网站在流量增长或骤然出现流量峰值时都很容易发生性能问题.甚至宕机(这一般会在服务器最繁忙的时候发生).此外在运行期间,无论是流

[译]用NGINX最大化发挥PYTHON性能

原文:Maximizing Python Performance with NGINX, Part I: Web Serving and Caching 介绍NGINX和Python如何配合使用 Python以易用,有趣而出名,它让软件开发变得简单,据说运行性能也高于其他脚本语言(PHP最新版本PHP 7的性能好像可以与Python一较高下) 每一个人都希望自己的网站或应用可以运行得更快.但是每一个网站在大流量和流量激增时都容易遇到性能问题,甚至当机,业务繁忙时,这种情况会更加糟糕.其实无论流量

Python性能优化

1.优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想. 2.减少冗余数据 如用上三角或下三角的方式去保存一个大的对称矩阵.在0元素占大多数的矩阵里使用稀疏矩阵表示. 3.合理使用copy与deepcopy 对于dict和list等数据结构的对象,直接赋值使用的是引用的方式.而