python 一些方法的時間測試


嘗試一些方法的不同實現,比較一下時間,電腦比較渣,不過只是做個比較

雖然用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 來遍歷下標好了

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM