2017-07-27 20 views
3

我想創建一個大的數字列表。
a = '1 1 1 2 2 0 0 1 1 1 1 9 9 0 0'(它超過了一千萬)。需要更快更有效的方式將元素添加到Python中的列表中

我嘗試以下方法:

  1. %timeit l = list(map(int, a.split()))這是4.07 µs per loop
  2. %timeit l = a.split(' ')這是462 ns per loop
  3. %timeit l = [i for i in a.split()]1.19 µs per loop

據我所知,第二和第三個變種字符列表,而第一個是整數列表,這很好。但是,隨着元素數量超過千萬,創建列表可能需要6秒鐘的時間。這對我的目的來說太長了。 有人能告訴我一個更快和更有效的方式來做到這一點。

感謝

+0

輸入是空間分離的字符構成的字符串,我需要它是一個列表,以便它是可變的。 –

+0

只是好奇,什麼是可接受的速度呢?秒處理1000萬個項目似乎是合理的 –

+0

這是一個更大的代碼的一部分,所以我試圖看看我是否可以減少在這裏的時間。 –

回答

4

在普通的Python,不使用第三方擴展,a.split()應該是你輸入分割成一個列表的最快方法。 str.split()函數只有一個工作,它專門用於此用途。

+0

感謝您的快速解答。我想知道是否有更快的方法。 –

+0

嘗試了其他數據集,str.split()是我發現的最快速的方法。 –

3

如果你知道你的輸入包括用一個空格隔開,那麼你也可以考慮個位數:

b = ord('0') 
[ord(a)-b for a in A[::2]] 

這使得1000萬個整數的列表在0.2秒內我的電腦上。

2

我在jupyter筆記本上測試了各種答案,而彼得·德里瓦斯似乎並沒有提出其他人提出的建議。

enter image description here

有趣的是,映射到整數似乎是瓶頸。操作本身的速度要快一個數量級。

enter image description here

+0

如果你想用我的方法進行測試,它只適用於使用單個數字的數字,所以當你製作digit_string的時候,把str(x)改成str(x%10)(這應該快3倍) –

+0

Ahh yup對不起,更新答案!爲什麼使用'Ord'比鑄造Int更快? –

+0

因此,像@Raymond Hettinger提到的那樣,'str.split()'函數似乎是將元素存儲到列表的最優化方式。 –

相關問題