2015-03-08 76 views
0

假設loc是一個2d字符列表,我想將它連接成一個字符串s。一般來說,以下哪個代碼更快?將2d字符列表連接成一個字符串

s = ''.join([''.join(row) for row in loc]) 

s = ''.join([x for row in loc for x in row]) 

謝謝!

+4

疑問,衡量 – oefe 2015-03-08 18:55:55

+0

我覺得'「」。加入(chain.from_iterable(LOC))'將超越。 – 2015-03-08 18:58:30

+0

可能是第一個,因爲只有一次迭代。 – 2015-03-08 18:58:48

回答

2

您可以使用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 = 。

因此,s1s2花費的時間少。

+0

你的意思是'當你寫'split'時加入',對吧? – user1016274 2015-03-08 19:40:53

+0

@ user1016274是的,我的意思是'join'。這是一個錯誤,謝謝。 – 2015-03-08 19:43:11

+1

非常好的解釋。謝謝! – Luke 2015-03-08 21:16:29

2

下面是你提到的兩種方法的時序結果,以及使用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 
+0

感謝您的回答,並使用intertools.chain.from_iterable添加結果。不過,我不能接受多於一個有用的答案。 – Luke 2015-03-08 21:20:24

相關問題