zoukankan      html  css  js  c++  java
  • python性能优化摘录 分类: python 20130117 18:01 1192人阅读 评论(0) 收藏

    字符串

    python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。对字符串的优化也是改善性能的一个重要的方面,特别是在处理文本较多的情况下。

    1. 在字符串连接的使用尽量使用 join() 而不是 +;

    2. 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'));

    3. 对字符进行格式化比直接串联读取要快,因此要在字符串与其他变量连接时就使用格式化字符串.请查看下面的连接形式:

    name="Andre" 
    print "Hello " + name 
    print "Hello %s" % name

    显然与第一个语句相比,第二个print语句更加优化.第三行中的括号是不需要的。



    使用内建函数

    你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速.

    clip_image004


    使用join()连接字符串

    你可以使用 "+" 来连接字符串. 但由于string在Python中是不可变的,每一个"+"操作都会创建一个新的字符串并复制旧内容. 常见用法是使用Python的数组模块单个的修改字符;当完成的时候,使用 join() 函数创建最终字符串.

    >>> #This is good to glue a large number of strings 
    >>> for chunk in input(): 
    >>> my_string.join(chunk)

    使用Python多重赋值,交换变量

    在Python中即优雅又快速: 
    >>> x, y = y, x 
    这样很慢: 
    >>> temp = x 
    >>> x = y 
    >>> y = temp

    尽量使用局部变量

    Python 检索局部变量比检索全局变量快. 这意味着,避免 "global" 关键字.

    尽量使用 "in"

    使用 "in" 关键字. 简洁而快速.

    >>> for key in sequence: 
    >>> print “found”

    为无限循环使用 "while 1"

    有时候在程序中你需一个无限循环.(例如一个监听套接字的实例) 尽管 "while true" 能完成同样的事, 但 "while 1" 是单步运算. 这招能提高你的Python性能.

    使用 Lazy if-evaluation 的特性

    Python 中条件表达式是 lazy evaluation 的,也就是说如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。

    使用list comprehension和generator expression

    从Python 2.0 开始,你可以使用 list comprehension 取代大量的 "for" 和 "while" 块. 使用List comprehension通常更快,Python解析器能在循环中发现它是一个可预测的模式而被优化.额外好处是,list comprehension更具可读性(函数式编程),并在大多数情况下,它可以节省一个额外的计数变量。列表解析要比在循环中重新构建一个新的 list 更为高效,因此我们可以利用这一特性来提高运行的效率。例如,让我们计算1到10之间的偶数个数:

    >>> # the good way to iterate a range 
    >>> evens = [ i for i in range(10) if i%2 == 0] 
    >>> [0, 2, 4, 6, 8] 
    >>> # the following is not so Pythonic 
    >>> i = 0 
    >>> evens = [] 
    >>> while i < 10: 
    >>> if i %2 == 0: evens.append(i) 
    >>> i += 1 
    >>> [0, 2, 4, 6, 8]

    生成器表达式则是在 2.4 中引入的新内容,语法和列表解析类似,但是在大数据量处理时,生成器表达式的优势较为明显,它并不创建一个列表,只是返回一个生成器,因此效率较高。例如:代码 a = [w for w in list] 修改为 a = (w for w in list),运行时间进一步减少,缩短约为 2.98s。



  • 相关阅读:
    HTML(图像img、表格table、列表)
    HTML(标题h、段落p、文本格式化、链接a、头部head)
    List的复制 (浅拷贝与深拷贝)
    最新CentOS6.5安装Docker, 使用阿里云源下载(亲测)
    VirtualBox安装CentOS6.5
    P1010 幂次方 题解
    P1469 找筷子 题解
    P1866 编号 题解
    EasyNVR通道离线但视频流可正常播放是什么原因导致的?
    EasyNVR通过国标GB28181协议级联出现报错及播放不了的问题调整
  • 原文地址:https://www.cnblogs.com/think1988/p/4628251.html
Copyright © 2011-2022 走看看