最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何优化python的效率

    正文概述    2020-08-04   280

    优化python的效率的方法:1、优化算法时间复杂度;2、减少冗余数据;3、合理使用copy与deepcopy;4、使用dict或set查找元素;5、合理使用生成器(generator)和yield。

    如何优化python的效率

    优化方法:

    (推荐教程:Python入门教程)

    1、优化算法时间复杂度

    算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。

    2、减少冗余数据

    如用上三角或下三角的方式去保存一个大的对称矩阵。在0元素占大多数的矩阵里使用稀疏矩阵表示。

    3、合理使用copy与deepcopy

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

    import copy
    a = range(100000)
    %timeit -n 10 copy.copy(a) # 运行10次 copy.copy(a)
    %timeit -n 10 copy.deepcopy(a)
    10 loops, best of 3: 1.55 ms per loop
    10 loops, best of 3: 151 ms per loop

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

    4、使用dict或set查找元素

    python dict和set都是使用hash表来实现(类似c++11标准库中unordered_map),查找元素的时间复杂度是O(1)

    a = range(1000)
    s = set(a)
    d = dict((i,1) for i in a)
    %timeit -n 10000 100 in d
    %timeit -n 10000 100 in s
    10000 loops, best of 3: 43.5 ns per loop
    10000 loops, best of 3: 49.6 ns per loop

    dict的效率略高(占用的空间也多一些)。

    5、合理使用生成器(generator)和yield

    %timeit -n 100 a = (i for i in range(100000))
    %timeit -n 100 b = [i for i in range(100000)]
    100 loops, best of 3: 1.54 ms per loop
    100 loops, best of 3: 4.56 ms per loop

    使用()得到的是一个generator对象,所需要的内存空间与列表的大小无关,所以效率会高一些。在具体应用上,比如set(i for i in range(100000))会比set([i for i in range(100000)])快。

    但是对于需要循环遍历的情况:

    %timeit -n 10 for x in (i for i in range(100000)): pass
    %timeit -n 10 for x in [i for i in range(100000)]: pass
    10 loops, best of 3: 6.51 ms per loop
    10 loops, best of 3: 5.54 ms per loop

    后者的效率反而更高,但是如果循环里有break,用generator的好处是显而易见的。yield也是用于创建generator:

    def yield_func(ls):
    for i in ls:
    yield i+1
     def not_yield_func(ls):
    return [i+1 for i in ls]
     ls = range(1000000)
    %timeit -n 10 for i in yield_func(ls):pass
    %timeit -n 10 for i in not_yield_func(ls):pass
    10 loops, best of 3: 63.8 ms per loop
    10 loops, best of 3: 62.9 ms per loop

    对于内存不是非常大的list,可以直接返回一个list,但是可读性yield更佳(人个喜好)。

    python2.x内置generator功能的有xrange函数、itertools包等。


    起源地下载网 » 如何优化python的效率

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元