假设loc是一个2d字符列表,我想将它连接成一个字符串s。一般来说,以下哪个代码更快?将2d字符列表连接成一个字符串
s = ''.join([''.join(row) for row in loc])
s = ''.join([x for row in loc for x in row])
谢谢!
假设loc是一个2d字符列表,我想将它连接成一个字符串s。一般来说,以下哪个代码更快?将2d字符列表连接成一个字符串
s = ''.join([''.join(row) for row in loc])
s = ''.join([x for row in loc for x in row])
谢谢!
您可以使用timeit模块查看时差。
import timeit
loc = [('a', 'b'),('c', 'd'), ('e', 'f')]
s1 = lambda: ''.join([''.join(row) for row in loc])
s2 = lambda: ''.join([x for row in loc for x in row])
print 'Time required by s1:', timeit.timeit(s1)
print 'Time required by s2:', timeit.timeit(s2)
给人的时间所需的结果为:
Time required by s1: 1.29390706928
Time required by s2: 1.46863953561
说明:
1)为S1: [''.join(row) for row in loc]
要求3 (for row in loc)
* 2 (''.join(row))
= 6次迭代 和我们得到['ab', 'cd', 'ef']
作为th的输入再次需要3次迭代的最外面的功能join
功能。 因此s1所需的迭代次数为6 + 3 = 。
2)为S2: [x for row in loc for x in row]
要求3 (for row in loc)
* 2 (for x in row)
= 6次迭代 ,我们得到['a', 'b', 'c', 'd', 'e', 'f']
作为输入用于最外层join
功能这需要6次迭代。 因此s2所需的迭代次数为6 + 6 = 。
因此,s1比s2花费的时间少。
你的意思是'当你写'split'时加入',对吧? – user1016274 2015-03-08 19:40:53
@ user1016274是的,我的意思是'join'。这是一个错误,谢谢。 – 2015-03-08 19:43:11
非常好的解释。谢谢! – Luke 2015-03-08 21:16:29
下面是你提到的两种方法的时序结果,以及使用itertools.chain.from_iterable
loc = np.random.randint(97, 123, (100, 100)).view('U2').tolist()
timeit.timeit("''.join([''.join(row) for row in loc])", setup="from __main__ import loc", number=10000)
1.1168044869991718
timeit.timeit("''.join([x for row in loc for x in row])", setup="from __main__ import loc", number=10000)
4.264987408001616
timeit.timeit("''.join(itertools.chain.from_iterable(loc))", setup="from __main__ import loc", number=10000)
2.068879542996001
感谢您的回答,并使用intertools.chain.from_iterable添加结果。不过,我不能接受多于一个有用的答案。 – Luke 2015-03-08 21:20:24
疑问,衡量 – oefe 2015-03-08 18:55:55
我觉得'“”。加入(chain.from_iterable(LOC))'将超越。 – 2015-03-08 18:58:30
可能是第一个,因为只有一次迭代。 – 2015-03-08 18:58:48