Python进阶系列一

概述

hi,朋友们大家好,今天将英文原著作者 @yasoob《Intermediate Python》进行翻译和在工作中使用的Python技巧进行了总结。Gitbook里面有翻译的版本,大家可以下载下来看看。我今天主要是将该英文原著翻译成适合自己的理解的语言,并附加一些自己在工作中使用Python的技巧。废话少说,下面我们依次来学习一下@yasoob的原著。

Intermediate Python 中译

如果在翻译过程中有问题或者code无法运行,还请各位大侠指正。

*args和**kwargs

我们在函数定义时,会经常使用*args和**kwargs这两个魔法变量,特别是函数参数数量不确定或参数较多时。当然*args和**kwargs这两个name并不是惟一的name,可以改成*as和**kwas,只要在命名前面加上修饰符*和**即可。我们先来看一下*args。

*args

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def test_args_kwargs(name,*args):
    print("frist arg: ",name)
    for arg in args:
        print("another arg through *argv: ",arg)

test_args_kwargs("brian","eric","rose")
#输出为
frist arg:  brian
another arg through *argv:  eric
another arg through *argv:  rose

我们也可以通过参数列表进行传递,比如:

1
2
3
4
5
names=("brian","eric","rose")
test_args_kwargs(*names)
frist arg:  brian
another arg through *argv:  eric
another arg through *argv:  rose

**kwargs

将不定长度的键值对作为参数传递给函数,我们来看一下。

1
2
3
4
5
6
7
8
9
def greet_me(**args):
    for key,value in args.items():
        print("{0}=={1}".format(key,value))

greet_me(name="brian",age=20,sex="男")
#输出为
name==brian
age==20
sex==

或者也可以这样

1
2
3
4
5
6
person = {"name":"brian","age":20,"sex":"男"}
greet_me(**person)
#输出为
name==brian
age==20
sex==

如何使用

在很多场景里面都大量使用比如: 1.装饰器 2.函数定义 3.单元测试 4.猴子补丁(在运行时修改某些代码),在英文版本里面主要介绍了通过猴子补丁修改API来进行测试。 ……

1
2
3
4
5
import someclass

def get_info(self,*args):
	return "Test Data"
someclass.get_info=get_info

Python 性能分析

Python性能分析与优化

一个优秀的程序员,在保证业务正常的条件下都会追求自己的程序更快、更省。更快:运行时间短;更省:相对节省计算机资源(比如:CPU、Memory)。一般都是以这两种衡量方式来度量自己的程序及进一步优化自己程序的空间。更专业的性能分析软件一般有两类方法论:event-based profiling和statistical profiling

Event-based Profiling

并不是所有编程语言都支持这类性能分析,支持这类分析的语言主要有:

  • Java:JVMTI(JVM Tools Interface,JVM工具接口)为性能提供了钩子,可以跟踪函数调用和事件执行等等。
  • .NET :也提供了事件监听器,主要得益于.net 运行时。
  • Python:可以利用sys.setprofile函数来跟踪函数python(call,return,exception)或者c(call,return,exception).

基于事件的性能分析(event-based profiler or tracing profiler)是通过手机程序执行过程中的具体事件进行工作的,这些性能分析会产生大量的数据,基本而言,你监听的事件越多产生的数据量句越多。这导致它们不太实用,在开始对程序进行性能往往不是首选,当其他性能分析不够用或者不精准它们可以作为最后的选择。 我们看一下一个python的例子:

Python GIL

概述

GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很多疑问?多线程真的很糟糕吗?我该如何实现多线程并发操作?今天博主带你详细的介绍一下GIL。

GIL原理

由于Python是动态解释性语言,即解释运行。运行Python代码时都会通过Python解释器解释执行,Python官方默认的解释器是Cython,当然你也可以选择自己的Python解释器(PyPy,JPython),其中JPython就没有GIL的限制。在解释器解释执行任何Python代码时,首先都需要they acquire GIL when running,release GIL when blocking for I/O。如果没有涉及I/O操作,只是CPU密集型操作或者,解释器会每隔100 ticks(低级的解释器指令)就释放GIL(通过 sys.setcheckinterval来修改)。GIL是实现Python解释器(Cython)时所引入的一个概念。GIL不是Python的特性。

线程执行模型

我们先看一下Python下多任务线程执行模型,下面的图取自David Beazley大神,并且在他的个人网站中对GIL进行深度的解剖。如果想了解更深入的东西,可以去逛逛他的网站。 Thread Execution Model