[英]Appending value to empty list or allocating value to pre-defined array?
在Python中,對於幾種應用程序,我通常必須將值存儲到數組中,例如:
results = []
for i in range(num_simulations):
...<calculate results_new>...
results.append(results_new)
但是我看到大多數其他示例代碼都首先聲明了一個零值數組:
results = np.zeros(len(num_simulations))
for i in range(num_simulations):
...<calculate results_new>...
results[i] = results_new
哪種做法更適合常規做法? 還是即使必須進行性能比較,兩種方法之間在時間和內存上是否真的存在顯着差異?
免責聲明:我或多或少只使用Python代碼進行模擬,因此我只是想在實踐中獲得更好的實踐。
關於使用numpy數組,您應該了解以下幾點:
因此,在您的應用程序中,如果您只是將結果存儲在列表中,而不執行任何數值方法,那么如果您不使用numpy,那就很好。 實際上,這樣做更有效,如下所示
In [29]: %%timeit
...: results=[]
...: num_simulations=10000
...: for i in range(num_simulations):
...: results.append(i)
...:
1000 loops, best of 3: 984 µs per loop
In [30]: %%timeit
...: num_simulations = 10000
...: results=np.zeros(num_simulations)
...: for i in range(num_simulations):
...: results[i]=i
...:
1000 loops, best of 3: 1.44 ms per loop
In [31]: %%timeit
...: results=[]
...: num_simulations=100000
...: for i in range(num_simulations):
...: results.append(i)
...:
100 loops, best of 3: 10.1 ms per loop
In [32]: %%timeit
...: num_simulations = 100000
...: results=np.zeros(num_simulations)
...: for i in range(num_simulations):
...: results[i]=i
...:
100 loops, best of 3: 15.4 ms per loop
In [33]: %%timeit
...: results=[]
...: num_simulations=1000000
...: for i in range(num_simulations):
...: results.append(i)
...:
10 loops, best of 3: 103 ms per loop
In [34]: %%timeit
...: num_simulations = 1000000
...: results=np.zeros(num_simulations)
...: for i in range(num_simulations):
...: results[i]=i
...:
10 loops, best of 3: 156 ms per loop
只是總結一下結果,
Normal list vs Numpy
984 vs 1440 microsecond for 10000 simulations
10.1 vs 15.4 millisecond for 100000 simulations
103 vs 156 millisecond for 1000000 simulations
顯然,僅使用列表,純粹用於存儲會更快,因為它不涉及堆內存分配開銷
但是,對於您想要在矩陣上執行的幾乎所有數值方法,Numpy都提供了更大的優勢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.