将二维字符列表连接成一个字符串
Join 2d list of characters into a string
假设loc是一个二维字符列表,我想把它拼接成一个字符串s。一般来说,以下哪个代码更快?
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']
作为最外层 join
函数的输入,这又需要 3 次迭代。
因此 s1 所需的迭代总数为 6 + 3 = 9.
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 = 12.
因此 s1 比 s2 花费的时间少。
以下是您提到的两种方法以及使用 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
假设loc是一个二维字符列表,我想把它拼接成一个字符串s。一般来说,以下哪个代码更快?
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']
作为最外层 join
函数的输入,这又需要 3 次迭代。
因此 s1 所需的迭代总数为 6 + 3 = 9.
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 = 12.
因此 s1 比 s2 花费的时间少。
以下是您提到的两种方法以及使用 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