簡體   English   中英

將值附加到空列表還是將值分配給預定義數組?

[英]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數組,您應該了解以下幾點:

  1. 如果您要使用矩陣,它們的速度會更快。 在您的應用程序中,僅存儲數據不會帶來任何額外的額外好處
  2. 但是,初始化它們既有代價,也有好處。 使用預先分配的空間的好處是您不必擔心會遇到內存問題等。缺點是分配那么大的內存空間的重載更為重要(請參見代碼結尾)。

因此,在您的應用程序中,如果您只是將結果存儲在列表中,而不執行任何數值方法,那么如果您不使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM