开发者社区> 问答> 正文

对python代码做性能的优化,请问如何合理使用生成器和yield?

已解决

对python代码做性能的优化,请问如何合理使用生成器和yield?

展开
收起
1780169608831412 2021-10-29 16:50:13 777 0
1 条回答
写回答
取消 提交回答
  • 网络规划设计师、敏捷专家、CISP、ITSS服务经理、ACA全科目、ACP4项、ACE、CBP、CDSP、CZTP等。拥有 PRINCE2 Foundation/Practitioner、CCSK、ITIL、ISO27001、PMP等多项国际认证。 专利5+、期刊10+、知识产权师。核心期刊审稿人。
    采纳回答

    您好,请看如下例子:

    %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包等。

    2021-10-29 16:51:31
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载