为何itertools.chain比扁平化列表推导式更快?
Python序列拼接的高效方法&效率对比
刚好之前折腾过Python里字符串和列表拼接的效率问题,来跟大家唠唠实用的方法和实测结果:
一、字符串序列拼接
如果要把一堆字符串拼起来,绝对优先用''.join([str1, str2, ...]),别用str1 + str2 + ...这种方式。原因很简单:Python里字符串是不可变对象,每次+都会生成新的字符串并拷贝内容,次数多了内存和时间开销都很大;而join会先计算总长度,一次性分配内存再拼接,效率甩+好几条街。
二、列表序列拼接
拼接多个列表的话,常见的有两种方法,实测下来itertools.chain始终比列表推导式更快,给大家看看测试代码和结果:
先上测试代码:
import random import itertools import timeit random.seed(100) # 生成10个各含1000个随机整数的列表 lsts = [[random.randint(0, 100) for _ in range(1000)] for _ in range(10)] # 测试itertools.chain方法 def test_chain(): return list(itertools.chain(*lsts)) # 测试列表推导式方法 def test_list_comp(): return [x for lst in lsts for x in lst] # 各跑1000次计时 print("itertools.chain 耗时:", timeit.timeit(test_chain, number=1000)) print("列表推导式 耗时:", timeit.timeit(test_list_comp, number=1000))
我本地跑出来的结果大概是itertools.chain耗时0.12左右,列表推导式耗时0.18左右(具体数值随环境略有差异,但chain更快是肯定的)。
为什么itertools.chain更快?因为它是用C实现的迭代器,不会生成中间列表,只是逐个迭代返回元素;而列表推导式虽然也是高效的写法,但本质还是Python层面的循环逻辑,在底层效率上比不过C实现的工具函数。
总结一下
- 字符串拼接:选
str.join()准没错 - 多列表拼接:优先用
list(itertools.chain(lst1, lst2, ...)),比列表推导式更高效
内容的提问来源于stack exchange,提问作者javidcf
相关产品推荐
相关产品推荐

