5年Python功力,总结了10个开发技巧( 二 )

这里我要介绍的是比上面两种都方便的多的方法,一行命令即可解决
[wangbm@localhost ~]$ python3 -m sitesys.path = ['/home/wangbm','/usr/local/Python3.7/lib/python37.zip','/usr/local/Python3.7/lib/python3.7','/usr/local/Python3.7/lib/python3.7/lib-dynload','/home/wangbm/.local/lib/python3.7/site-packages','/usr/local/Python3.7/lib/python3.7/site-packages',]USER_BASE: '/home/wangbm/.local' (exists)USER_SITE: '/home/wangbm/.local/lib/python3.7/site-packages' (exists)ENABLE_USER_SITE: True从输出你可以发现,这个列的路径会比 sys.path 更全,它包含了用户环境的目录 。

5年Python功力,总结了10个开发技巧

文章插图
 
将嵌套 for 循环写成单行我们经常会如下这种嵌套的 for 循环代码
list1 = range(1,3)list2 = range(4,6)list3 = range(7,9)for item1 in list1:for item2 in list2:for item3 in list3:print(item1+item2+item3)这里仅仅是三个 for 循环,在实际编码中,有可能会有更层 。
这样的代码,可读性非常的差,很多人不想这么写,可又没有更好的写法 。
这里介绍一种我常用的写法,使用 itertools 这个库来实现更优雅易读的代码 。
from itertools import productlist1 = range(1,3)list2 = range(4,6)list3 = range(7,9)for item1,item2,item3 in product(list1, list2, list3):print(item1+item2+item3)输出如下
$ python demo.py1213131413141415
5年Python功力,总结了10个开发技巧

文章插图
 
如何使用 print 输出日志初学者喜欢使用 print 来调试代码,并记录程序运行过程 。
但是 print 只会将内容输出到终端上,不能持久化到日志文件中,并不利于问题的排查 。
如果你热衷于使用 print 来调试代码(虽然这并不是最佳做法),记录程序运行过程,那么下面介绍的这个 print 用法,可能会对你有用 。
Python 3 中的 print 作为一个函数,由于可以接收更多的参数,所以功能变为更加强大,指定一些参数可以将 print 的内容输出到日志文件中
代码如下:
>>> with open('test.log', mode='w') as f:... print('hello, python', file=f, flush=True)>>> exit$ cat test.loghello, python
5年Python功力,总结了10个开发技巧

文章插图
 
如何快速计算函数运行时间计算一个函数的运行时间,你可能会这样子做
import timestart = time.time# run the functionend = time.timeprint(end-start)你看看你为了计算函数运行时间,写了几行代码了 。
有没有一种方法可以更方便的计算这个运行时间呢?
有 。
【5年Python功力,总结了10个开发技巧】有一个内置模块叫 timeit
使用它,只用一行代码即可
import timeimport timeitdef run_sleep(second):print(second)time.sleep(second)# 只用这一行print(timeit.timeit(lambda :run_sleep(2), number=5))运行结果如下
2222210.020059824
5年Python功力,总结了10个开发技巧

文章插图
 
利用自带的缓存机制提高效率缓存是一种将定量数据加以保存,以备迎合后续获取需求的处理方式,旨在加快数据获取的速度 。
数据的生成过程可能需要经过计算,规整,远程获取等操作,如果是同一份数据需要多次使用,每次都重新生成会大大浪费时间 。所以,如果将计算或者远程请求等操作获得的数据缓存下来,会加快后续的数据获取需求 。
为了实现这个需求,Python 3.2 + 中给我们提供了一个机制,可以很方便的实现,而不需要你去写这样的逻辑代码 。
这个机制实现于 functool 模块中的 lru_cache 装饰器 。
@functools.lru_cache(maxsize=None, typed=False)参数解读:
  • maxsize:最多可以缓存多少个此函数的调用结果,如果为None,则无限制,设置为 2 的幂时,性能最佳
  • typed:若为 True,则不同参数类型的调用将分别缓存 。
举个例子
from functools import lru_cache@lru_cache(None)def add(x, y):print("calculating: %s + %s" % (x, y))return x + yprint(add(1, 2))print(add(1, 2))print(add(2, 3))输出如下,可以看到第二次调用并没有真正的执行函数体,而是直接返回缓存里的结果
calculating: 1 + 233calculating: 2 + 35下面这个是经典的斐波那契数列,当你指定的 n 较大时,会存在大量的重复计算
def fib(n):if n < 2:return nreturn fib(n - 2) + fib(n - 1)第六点介绍的 timeit,现在可以用它来测试一下到底可以提高多少的效率 。


推荐阅读