为什么我的代码如此缓慢(效率低下)?我需要制作两种方法来记录处理给定大小的列表所需的时间。我有一个search_fast
和search_slow
的方法。即使这两个搜索时间之间存在差异。 Search_fast
仍然很慢。我想优化处理时间,而不是8.99038815498
search_fast
,65.0739619732
search_slow
。这只需要几分之一秒。我能做什么?我将永远感激一些技巧,因为编码对我来说仍然是很新的。:)
from timeit import Timer
def fillList(l, n):
l.extend(range(1, n + 1))
l = []
fillList(l, 100)
def search_fast(l):
for item in l:
if item == 10:
return True
return False
def search_slow(l):
return_value = False
for item in l:
if item == 10:
return_value = True
return return_value
t = Timer(lambda: search_fast(l))
print t.timeit()
t = Timer(lambda: search_slow(l))
print t.timeit()
最快的方法是使用 in
运算符,它测试序列中值的成员资格。
if value in some_container:
…
参考: https://docs.python.org/3/reference/expressions.html#membership-test-operations
更新:此外,如果您经常需要测试成员资格,请考虑使用集而不是列表。
一些优点和缺点可以在这里找到:https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset<</p>
在上面添加以下代码:
t = Timer(lambda: 10 in l)
print(t.timeit())
在我的系统上生成以下内容:
0.6166538814701169
3.884095008084452
0.29087270299795875
>>>
希望这有帮助。基本思想是利用底层C代码,而不是制作自己的Python代码。
我设法找出了导致代码缓慢的原因。通过extend
而不是append
添加到列表中是一个简单的错误。
def fillList(l, n):
l.**append**(range(1, n + 1))
l = []
fillList(l, 100)
现在search_slow
3.91826605797
打卡而不是65.0739619732
。但我不知道为什么它会对性能产生如此大的影响。