我正在撰寫一些 python,需要找到串列中最大數字的索引。我查了一下,發現是這樣的:
def find_indexes_1(nums)
return [index for index, number in enumerate(nums) if number == max(nums)]
經過一些測驗,我將這條線作為我的程式如此緩慢的主要原因。我決定在不使用串列理解的情況下重寫代碼。
def find_indexes_2(nums):
largest = 0
indexes = []
for index, number in enumerate(nums):
if number > largest:
indexes.clear()
indexes.append(index)
largest = number
elif number == largest:
indexes.append(index)
return indexes
這是閱讀更長,更難,但我發現它是顯著快于第一種方法。
from timeit import default_timer as timer
from random import randint
numbers = []
for i in range(10000):
numbers.append(randint(10, 55))
start = timer()
a = find_indexes_1(numbers)
end = timer()
time = str(end-start)
print(f'method 1 {time}') # 2.087865 seconds
start = timer()
b = find_indexes_2(numbers)
end = timer()
time = str(end-start)
print(f'method 2 {time}') # 0.001524 seconds
我的主要問題是為什么第一種方法要慢得多?我知道它在串列中回圈了兩次,但這并不能證明兩次之間存在如此大的差異是合理的。謝謝
uj5u.com熱心網友回復:
因為max(nums)這是nums線性進行的稱為len(nums)時間。與 O(n) in 相比,這為您提供了 O(n 2 ) 復雜度find_indexes_1find_indexes_2
你可以像這樣優化它:
def find_indexes_3(nums)
max_nums = max(nums) # compute this value once, takes O(n) time
return [index for index, number in enumerate(nums) if number == max_nums]
uj5u.com熱心網友回復:
問題是您正在呼叫max(nums)串列理解的每次迭代,并且這必須再次迭代串列。所以你有一個 O(n 2 ) 演算法。既然它不會改變,你應該呼叫一次。
def find_indexes_1(nums)
maxnum = max(nums)
return [index for index, number in enumerate(nums) if number == maxnums]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/348929.html
