page contents

掌握Python这三个技巧,代码效率提升10倍

很多人写Python觉得慢。写出来的脚本跑一次要等半天。电脑风扇呼呼转。代码看起来也不多。问题不在电脑配置。问题在写代码的习惯。有些习惯改一改,速度能差出好几倍。下面说三个技巧。都是平时容易忽略的地方。改完以后你会觉得之前的等待时间白花了。

attachments-2026-09-9DilJKCC6aab42c3e15ef.png很多人写Python觉得慢。写出来的脚本跑一次要等半天。电脑风扇呼呼转。代码看起来也不多。问题不在电脑配置。问题在写代码的习惯。有些习惯改一改,速度能差出好几倍。下面说三个技巧。都是平时容易忽略的地方。改完以后你会觉得之前的等待时间白花了。

技巧一

循环外提 · 减少重复计算

第一个技巧跟循环有关。很多人习惯在循环里反复做同一件事。比如每次循环都去读一个文件。或者每次都去调用一个同样的函数算一个固定值。这类操作在循环里重复一万次,就是一万次浪费。把不变的东西挪到循环外面。这个动作很简单。效果很明显。

看一个例子。假设你要处理一批数据。每个数据都跟一个固定系数相乘。有人会这样写。

data = [1, 2, 3, 4, 5] result = [] for x in data:     factor = 2.5 * 1.8 + 0.3     result.append(x * factor)

这段代码里,factor 每次循环都算一遍。它的值其实永远不会变。把它提到循环外面。代码变成这样。

data = [1, 2, 3, 4, 5] result = [] factor = 2.5 * 1.8 + 0.3 for x in data:     result.append(x * factor)

改动很小。当数据量是十万条的时候,省下的时间够你泡一杯茶。这个技巧不挑场景。任何循环里只要有不依赖循环变量的计算,都能往外提。字符串拼接也常用这个思路。有人喜欢在循环里用加号连字符串。每次加号都会新建一个字符串对象。数据一多,内存和时间都扛不住。用 join 方法一次性拼完。或者把结果先放进列表,最后统一处理。这些做法都比循环里硬拼要快。

技巧二

集合查找 · 告别线性遍历

第二个技巧跟查找有关。Python 里判断一个元素在不在某个集合里,用 in 操作。这个操作快不快,取决于右边是什么类型。如果是列表,Python 会从头到尾一个一个比。数据量大的时候,找一次要很久。如果是集合或者字典的键,Python 用哈希表。找一次几乎不花时间。这个差别在数据量小的时候感觉不到。数据量一大,差距就出来了。

举个实际场景。你有一个用户ID列表,几十万个。还有一个黑名单。你要判断每个用户ID在不在黑名单里。如果黑名单是列表,每次判断都要遍历。几十万次判断,每次遍历几十万条。这个计算量会卡死程序。把黑名单改成集合。判断一次就是一次哈希查找。速度差几百倍都不止。

black_list = ['user1', 'user2', ...]  # 很多条 black_set = set(black_list) for uid in all_users:     if uid in black_set:         pass

这个改动不需要动逻辑。只需要在初始化的时候加一行 set()。字典的键也有同样的效果。如果你既有黑名单又要存额外信息,直接用字典。键用来判断,值用来存数据。一举两得。记住一个原则。需要频繁判断存在性的地方,别用列表。用集合或者字典。

技巧三

生成器迭代 · 内存零压力

第三个技巧跟内存和生成器有关。很多人处理大文件的时候,喜欢先读进内存。比如 readlines() 一次把整个文件读成列表。文件小的时候没事。文件几个G的时候,内存直接爆掉。程序要么卡死,要么被系统杀掉。用生成器可以一行一行处理。内存占用几乎不变。速度也不会慢。

看文件处理的例子。常见写法是这样。

with open('big_file.txt') as f:     lines = f.readlines()     for line in lines:         process(line)

这段代码会把整个文件读进内存。改成这样。

with open('big_file.txt') as f:     for line in f:         process(line)

文件对象本身就是可迭代的。每次只读一行。内存里始终只有一行数据。处理几个G的文件跟处理几K的文件,内存占用差不多。这个技巧在数据清洗和日志分析里特别有用。很多人处理日志的时候,日志文件每天几个G。用 readlines 读一次就崩溃。用 for line in f 就能稳稳跑完。

生成器表达式也能省内存。列表推导式用方括号。生成器表达式用圆括号。方括号会一次生成所有结果。圆括号只在需要的时候生成下一个。如果你只是遍历一次,不重复使用结果,用圆括号。比如 sum(x * 2 for x in range(1000000))。这里用圆括号,内存里不会出现一个百万长度的列表。sum 边算边加。内存占用很小。速度也不差。

总结一下:这三个技巧都不复杂。循环里不变的东西往外提。频繁查找用集合或字典。大文件用迭代不用 readlines。每一个改动都只需要几行代码。改完以后跑一遍,你会看到时间明显缩短。内存占用明显下降。写代码的时候多想想数据怎么流动。多想想哪些操作是重复的。哪些数据结构更适合当前任务。这些思考花不了多少时间。省下的运行时间却很多。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2420 篇文章

作家榜 »

  1. Pack 2420 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章