嘗試一些方法的不同實現,比較一下時間,電腦比較渣,不過只是做個比較
雖然用python主要是方便,肯定是不快的,不過能快一點還是快一點好
numpy中大量使用同樣 shape 的全 0 array,可以使用 np.zero() 方法或者是先開一個之后 copy:
1 %%time 2 for i in range(5000000): 3 a = np.zeros((100,10)) 4 a = np.zeros((100,10)) 5 a = np.zeros((100,10))
Wall time: 17.1 s
1 %%time 2 b = np.zeros((100,10)) 3 for i in range(5000000): 4 a = b.copy() 5 a = b.copy() 6 a = b.copy()
Wall time: 15.1 s
貌似先開一個,之后copy比較快,不過差異不明顯
range() 還是 np.arrange(),最近用 array 有點多,經常啥都開 array
1 %%time 2 for p in range(50000): 3 a = np.arange(100000)
Wall time: 3.72 s
%%time for p in range(50000): a = range(100000)
Wall time: 31 ms
差距還是非常明顯(不用想都知道2333),如果不需要用 array 方法的時候,還是 list 好了
訪問 list 等下標,用 range(長度),不過先保存長度成常量還是多次用 len 方法
1 %%time 2 a = np.arange(100000) 3 l = len(a) 4 for p in range(50000000): 5 range(l)
Wall time: 23.3 s
1 %%time 2 a = np.arange(100000) 3 for p in range(50000000): 4 range(len(a))
Wall time: 27.9 s
就這樣看,應該調用 len 方法還是有點慢的,雖然差異也不是非常大,len 應該不是 O(n) 實現,可能是對象直接保存的一個屬性,不過訪問起來還是先存下來更快點
遍歷一個 array ,同時使用標號
我會遍歷下標長度的一個 list 來遍歷它,用 zip 把標號和 array 合並,或者 emunerate ,或者干脆維護一個 id,循環中累加
1 %%time 2 for i in range(5000000): 3 a = np.arange(10,30) 4 l = len(a) 5 for id in range(l): 6 x = id+a[id]
Wall time: 50 s
1 %%time 2 for i in range(5000000): 3 a = np.arange(10,30) 4 b = zip(range(len(a)),a) 5 for item1,item2 in b: 6 x = item1+item2
Wall time: 51.2 s
1 %%time 2 for i in range(5000000): 3 a = np.arange(10,30) 4 c = enumerate(a) 5 for item1,item2 in c: 6 x = item1+item2
Wall time: 52.3 s
1 %%time 2 for i in range(5000000): 3 a = np.arange(10,30) 4 d = zip(np.arange(len(a)),a) 5 for item1,item2 in d: 6 x = item1+item2
Wall time: 52.9 s
1 %%time 2 for i in range(5000000): 3 a = np.arange(10,30) 4 id = 0 5 for item in a: 6 x = id+item 7 id += 1
Wall time: 1min 1s
看上去只有維護 id 累加最慢,其他都差別不太大,那只要條件允許大概還是按 C 的習慣開一個下標的 list 來遍歷下標好了