首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这10个Python性能调优的小技巧,你知道几个?

这10个Python性能调优的小技巧,你知道几个?

作者头像
double
发布2021-11-25 10:08:50
发布2021-11-25 10:08:50
49900
代码可运行
举报
文章被收录于专栏:算法channel算法channel
运行总次数:0
代码可运行

你好,我是 zhenguo 这是我的第479篇原创,这篇文章关于Python性能调优的10个小技巧,每天花5-10分钟阅读我的文章,对你技术提升一定会有帮助。

1 多多使用列表生成式

替换下面代码:

代码语言:javascript
代码运行次数:0
运行
复制
cube_numbers = []
  for n in range(0,10):
    if n % 2 == 1:
      cube_numbers.append(n**3)

为列表生成式写法:

代码语言:javascript
代码运行次数:0
运行
复制
cube_numbers = [n**3 for n in range(1,10) if n%2 == 1]

2 内置函数

尽可能多使用下面这些内置函数:

3 尽可能使用生成器

单机处理较大数据量时,生成器往往很有用,因为它是分小片逐次读取,最大程度节省内存,如下网页爬取时使用yield

代码语言:javascript
代码运行次数:0
运行
复制
import requests
import re

def get_pages(link):
  pages_to_visit = []
  pages_to_visit.append(link)
  pattern = re.compile('https?')
  while pages_to_visit:
    current_page = pages_to_visit.pop(0)
    page = requests.get(current_page)
    for url in re.findall('<a href="([^"]+)">', str(page.content)):
      if url[0] == '/':
        url = current_page + url[1:]
      if pattern.match(url):
        pages_to_visit.append(url)
    # yield
    yield current_page
webpage = get_pages('http://www.example.com')
for result in webpage:
  print(result)

4 判断成员所属关系最快的方法使用 in

代码语言:javascript
代码运行次数:0
运行
复制
for name in member_list:
  print('{} is a member'.format(name))

5 使用集合求交集

替换下面代码:

代码语言:javascript
代码运行次数:0
运行
复制
a = [1,2,3,4,5]
b = [2,3,4,5,6]

overlaps = []
for x in a:
  for y in b:
    if x==y:
      overlaps.append(x)

print(overlaps)

修改为set和求交集:

代码语言:javascript
代码运行次数:0
运行
复制
a = [1,2,3,4,5]
b = [2,3,4,5,6]

overlaps = set(a) & set(b)

print(overlaps)

6 多重赋值

Python支持多重赋值的风格,要多多使用

代码语言:javascript
代码运行次数:0
运行
复制
first_name, last_name, city = "Kevin", "Cunningham", "Brighton"

7 尽量少用全局变量

Python查找最快、效率最高的是局部变量,查找全局变量相对变慢很多,因此多用局部变量,少用全局变量。

8 高效的itertools模块

itertools模块支持多个迭代器的操作,提供最节省内存的写法,因此要多多使用,如下求三个元素的全排列:

代码语言:javascript
代码运行次数:0
运行
复制
import itertools
iter = itertools.permutations(["Alice", "Bob", "Carol"])
list(iter)

9 lru_cache 缓存

位于functools模块的lru_cache装饰器提供了缓存功能,如下结合它和递归求解斐波那契数列第n:

代码语言:javascript
代码运行次数:0
运行
复制
import functools

@functools.lru_cache(maxsize=128)
def fibonacci(n):
  if n == 0:
    return 0
  elif n == 1:
    return 1
  return fibonacci(n - 1) + fibonacci(n-2)

因此,下面的递归写法非常低效,存在重复求解多个子问题的情况:

代码语言:javascript
代码运行次数:0
运行
复制
def fibonacci(n):
  if n == 0: # There is no 0'th number
    return 0
  elif n == 1: # We define the first number as 1
    return 1
  return fibonacci(n - 1) + fibonacci(n-2)

10 内置函数、key和itemgetter

上面提到尽量多使用内置函数,如下对列表排序使用keyoperator.itemgetter

代码语言:javascript
代码运行次数:0
运行
复制
import operator
my_list = [("Josh", "Grobin", "Singer"), ("Marco", "Polo", "General"), ("Ada", "Lovelace", "Scientist")]
my_list.sort(key=operator.itemgetter(0))
my_list
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 多多使用列表生成式
  • 2 内置函数
  • 3 尽可能使用生成器
  • 4 判断成员所属关系最快的方法使用 in
  • 5 使用集合求交集
  • 6 多重赋值
  • 7 尽量少用全局变量
  • 8 高效的itertools模块
  • 9 lru_cache 缓存
  • 10 内置函数、key和itemgetter
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档