列表中字符串合并大列表


['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']
合并成一个大列表
[1,2,3,4,5,6,7,8,9,10,11,12]
假设列表的长度为20000,请问如何合并速度更加快
使用列表推导式
[x for j in res_str for x in eval(j)]
速度不是很快

除了生成器还有别的办法?

阅读 1.9k
2 个回答
list_com1 = '[x for j in [str([x for x in range(20000)][i:i+3]) for i in range(0,len([x for x in range(20000)]),3)] for x in eval(j)]'

list_com2 = '''
import json
[x for j in [str([x for x in range(20000)][i:i+3]) for i in range(0,len([x for x in range(20000)]),3)] for x in json.loads(j)]'''

gen_com1 = '(x for j in [str([x for x in range(20000)][i:i+3]) for i in range(0,len([x for x in range(20000)]),3)] for x in eval(j))'

gen_com2 = '''import json
(x for j in [str([x for x in range(20000)][i:i+3]) for i in range(0,len([x for x in range(20000)]),3)] for x in json.loads(j))'''


import timeit

print(timeit.timeit(stmt=list_com1, number=1))
print(timeit.timeit(stmt=list_com2, number=1))
print(timeit.timeit(stmt=gen_com1, number=1))
print(timeit.timeit(stmt=gen_com2, number=1))

图片描述

如图所示,我们可以得出如下结论:

  1. 生成器要比列表推导快一些。
  2. eval() 要比 json.loads() 快些。

其实,这个 timeit 测试速度比较慢的原因,是我们生成 20000 个如题主所示的列表的时候,占用了过多的时间和内存。

from itertools import chain


l = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']
res = chain(*map(eval, l))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题