Python-tips

关于Python,随着版本变化,出现了很多的tips,本文记录各种tips以及关于Python一些必须知道而且非常重要的知识。

全局解释器锁:任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

其他:

关于执行一段代码的时间计算问题。

是的,我使用过装饰器写自己的函数执行时间计算的功能。在阅读邮件的时候,看到了有一个库叫“timeit”,可以通过如下代码简单的获取一段代码的执行
时间,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))',
number=10000)

0.3412662749997253

>>> timeit.timeit('"-".join([str(n) for n in range(100)])',
number=10000)

0.2996307989997149

>>> timeit.timeit('"-".join(map(str, range(100)))',
number=10000)

0.24581470699922647

其中,number是一个执行次数的参数,默认是十万次。然后返回执行的平均时间。

忽然发现上次没有保存好博客内容。再记录一次,权当复习一次。

关于设置默认的字典内容:

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name_for_userid = {
382: "Alice",
590: "Bob",
951: "Dilbert",
}

def greeting(userid):
return "Hi %s!" % name_for_userid.get(userid, "there")

>>> greeting(382)
"Hi Alice!"

>>> greeting(333333)
"Hi there!"

关于为字典排序,针对的是字典的值,而不是键

看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# How to sort a Python dict by value
# (== get a representation sorted by value)

>>> xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}

>>> sorted(xs.items(), key=lambda x: x[1])
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]

# Or:

>>> import operator
>>> sorted(xs.items(), key=operator.itemgetter(1))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]

可以通过lambda函数写一个排序的功能,也可以导入辅助的,借助写好的方法去处理。