2012-12-21 23 views
1

在我的代碼中,列表最終會以所有元素爲空來結束。這就是我測試的所有元素==''。在Python中這將是與列表進行比較/測試的最快方法

列表的大小可能因輸入而異。

我正在考慮的兩個測試是一個相等測試,並使用list.count()函數。運行時速度會更快。

我是python的新手,所以如何在後臺完成事情並不是我所熟悉的。我的假設是,測試2將更快,如果它不迭代檢查每個元素進行比較。由於列表中的數據可能會從空字符串變爲超過100個字符的字符串,因此測試1 count('')的簡單檢查也可能非常快。

示例代碼設置我的變量進行測試。

mylist = [''] * 33 
testlist = [] 
testlist.extend('' * mylist.__len__()) 
testlist.count('') 
33 
mylist.count('') 
33 

以下哪項測試會更快。

測試1

if mylist.count('') == 33: 
    do some thing 

while mylist.count('') !=33: 
    do some thing 

測試2

if mylist == testlist: 
    do some thing 

while mylist != testlist: 
    do some thing 

回答

1

你不介紹​​您實際上是試圖解決問題,但您在設置列表條目爲空字符串爲了標記它們已完成,以便您不再處理它們?

如果是這樣的話,那麼你可以通過使用不同的數據結構來獲得更好的結果。例如,也許你可以在完成它們後使用setremove項目。然後你可以測試一下,看看你的設備是否是空的,這是一個恆定時間的操作。

但是,爲了能夠幫助您,我們需要更多地瞭解您要做的事情。

如果你只是想弄清楚哪兩個實現更快,Python的timeit module包含代碼定時執行功能。例如:

>>> from timeit import timeit 
>>> l1 = [''] * 1000 
>>> l2 = [''] * 1000 
>>> timeit(lambda:l1 == l2) 
4.670141935348511 
>>> timeit(lambda:l1.count('') == len(l1)) 
4.50224494934082 

所以看起來這兩種方法需要在這種情況下幾乎完全一樣的時間(因爲你可能已經猜到了)。但在列表不是完全空字符串的情況下,==更快(因爲當它找到一個匹配就可以立即返回False無需檢查更多的列表元素):

>>> l3 = ['a'] + [''] * 999 
>>> timeit(lambda:l3.count('') == len(l3)) 
4.379799842834473 
>>> timeit(lambda:l3 == l2) 
0.19073486328125 
+0

timeit看起來非常有用。我會去試驗我的一些代碼,看看它是如何運行的。 – nelaaro

相關問題