2017-07-27 10 views
3

大きな番号のリストを作成しようとしています。
a = '1 1 1 2 2 0 0 1 1 1 1 9 9 0 0'(これは1000万を超えます)Pythonのリストに要素を追加するための、より効率的な方法が必要です

私はこれらのメソッドを試してみた:

  1. %timeit l = list(map(int, a.split()))それはそれは私が2番目と3番目の変異体があることを理解1.19 µs per loop

を取り、これは462 ns per loop

  • %timeit l = [i for i in a.split()]4.07 µs per loop
  • %timeit l = a.split(' ')ました最初は整数リストですが、これは問題ありません。しかし、要素の数が1000万を超えると、リストを作成するまでに最大6秒かかることがあります。これは私の目的にとっては長すぎます。 誰かが私にこれを行うより速く効率的な方法を教えてもらえますか?平野Pythonで

  • +0

    入力は、それが可変であるように私は、それをリストする必要があり、スペースで区切られた文字列です。 –

    +0

    ちょうど好奇心が強い、これに対して許容可能な速度は何ですか?数秒で10百万アイテムを処理することは賢明だと思われる –

    +0

    これはより大きなコードの一部なので、ここで時間を短縮できるかどうか確認しようとしていました。 –

    答えて

    4

    おかげで、サードパーティ製の拡張機能を使用していない、a.split()はリストにあなたの入力を分割する最速の方法であるべきです。 str.split()機能には1つのジョブしかなく、この用途に特化しています。

    +0

    クイック回答ありがとうございます。より速い方法があるかどうか疑問に思っていました。 –

    +0

    他のデータセットとstr.split()を試してみたのが、私が見つけた最速の方法でした。 –

    3

    あなたの入力は、単一のスペースで区切られた単一の数字で構成されて知っているならば、あなたも考慮することができます。

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

    これは私のコンピュータ上で0.2秒で千万整数のリストを作ります。

    2

    jupyterノートブックでさまざまな回答をテストしましたが、Peter de Rivasは提案されているその他のものを除外しているようです。

    enter image description here

    興味深いことに、整数にマッピングがボトルネックのようです。 str.split()の操作自体は、1桁高速です。

    enter image description here

    +0

    私のメソッドでテストしたい場合は、1桁の数字が使われている場合にのみ動作しますので、digit_stringを作るときにstr(x)をstr(x%10)に変更してください(これで約3倍速くなります) –

    +0

    Ahh yup申し訳ありませんが、更新の回答!なぜOrdを使うのがIntにキャストするより速いのですか? –

    +0

    @Raymond Hettingerが述べたように、 'str.split()'関数は要素をリストに格納する最も最適な方法です。 –

    関連する問題