浅谈python性能与优化

楔子程序猿李狗蛋利用python3.6花了5分钟写了个数据处理的脚本,心中甚是喜悦,果然高效啊,但随着时间一分一秒过去了,任务还在处理中,李狗蛋拍案而起,冲着python怒道:你咋运行的这么慢!python一脸无辜:容~容我解释一下!,李狗蛋:你解释个毛线!闻此言,python也怒了:爷就这样,不喜欢滚犊子!李狗蛋:…..1. 为什么python运行慢1.1 解释执行python程...
摘要由CSDN通过智能技术生成

楔子

程序猿李狗蛋利用python3.6花了5分钟写了个数据处理的脚本,心中甚是喜悦,果然高效啊,但随着时间一分一秒过去了,任务还在处理中,李狗蛋拍案而起,冲着python怒道:你咋运行的这么慢!python一脸无辜:容~容我解释一下!,李狗蛋:你解释个毛线!闻此言,python也怒了:爷就这样,不喜欢滚犊子!李狗蛋:…..

1. 为什么python运行慢

1.1 解释执行

python程序在执行前会先编译为pyc字节码文件,里边包含的是python虚拟机指令,真正执行的时候再把虚拟指令解释为本地机器指令从而开始执行,每次执行都要经过这样一个过程,即使是相同的代码,然后从虚拟指令解释为机器指令这一过程又是相当耗时的,这也是python运行慢的一大原因。

1.2 弱类型

python在定义变量或函数时不会声明类型,即使在编译为pyc字节码后变量的类型以及函数返回类型都是未知的,必须要在运行时(也就是将虚拟指令解释为机器指令的过程)通过上下文推算出实际的类型,比如a + b 先要通过复杂的上下文推荐得出a和b的实际类型,进而再转换为对应的机器指令,不像其他强类型语言,比如java,所有数据类型在编译为class文件时都已经确定了,不需要额外耗时去做类型推算。

1.3 一切皆对象

这其实体现的是python的动态性,通过一个例子来看:

class AOP:
    def save(self):
        print("saved")
old_save = AOP.save
def new_save(self):
    print("before save")
    old_save(self)
    print("after save")
AOP.save = new_save
a = AOP()
a.save()

1.4 老生常谈GIL

通过python这个特性可以轻松实现AOP编程,但是python是通过引用计数来管理对象的,这个一切皆对象的特性无疑又增加了虚拟机额外的负担,对运行效率产生影响,可谓是一把双刃剑。

地球人都知道,由于GIL(全局解释器锁)的存在,导致python无法运用真正的多线程,使并行处理能力稍显逊色。

以上这几点都是python的硬伤,目前暂时无法改变其现状。但还是可以通过代码层面的优化,提高程序的运行效率,接下来就谈谈从哪些方面下手以及注意点。

2. 优化

2.1 排序

python中内置的排序函数有两个:list.sort()和标准内置函数sorted(),两个函数接受同样的关键字参数key和reverse,先通过几个简单小例子来展示下排序函数的用法:

l = ['hello', 'Wor', 'H']
new_l = sorted(l, key=str.lower, reverse=True)
print("sorted:", new_l)
l.sort(key=str.lower, reverse=True)
print("list.sort:", l)

from operator import itemgetter

l = [("Tom", 88), ("Peter", 76), ("Jason", 82)]
#以元组中第二个元素作为排序的key
new_l = sorted(l, key=itemgetter(1))
print("sorted:", new_l)
l.sort(key=itemgetter(1))
print("list.sort:", l)

sorted函数会返回一个新的排好序的列表,而list.sort则是在原列表上就地排序,从这点上就可以看出list.sort的性能要好于sorted函数通过例子可以看到,两个排序函数的用法基本相同,但还是有区别的,下边是几点tips:

  • list.sort只能用于list上,这点很明显。而sorted则可以对任何可迭代的对象排序,通用性更强。
  • 对于关键字参数key的定义尽量使用内置函数或方法,例如1-2中也可以用自定义的函数key=lambda item:item[1],但是其性能不如itemgetter好

python2版本(2.4-2.7)还提供了一个名为cmp的关键字参数,用来指定自定义的排序算法,但一般情况下不推荐使用自定义的算法,因为性能大多数情

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值