3

0 から 1000000000 までの数字のリストを文字列としてテキスト ファイルに直接書き込もうとしています。また、各数値の先頭に 10 桁までのゼロを付けたいと思います。たとえば、0000000000, 0000000001, 0000000002, 0000000003, ... n.時間がかかりすぎていることがわかりました。

を使用できますが、先行ゼロはサポートされていないため、これらのタスクを処理するために およびその他の補助ツールをseq使用することは避けたいと考えています。awkこれを C でコーディングするだけで劇的なスピードアップのメリットがあることは認識していますが、それに頼りたくありません。いくつかの関数を大きなリストにマッピングしてループで実行することを検討していましたが、使用できる RAM は 2GB しかないため、問題に取り組む際はこの点に留意してください。

私はPython-Progressbarを使用しており、約 2 時間の ETA を取得しています。この問題に対処する方法について、誰かが私にアドバイスを提供してくれれば幸いです。

pbar = ProgressBar(widgets=[Percentage(), Bar(), ' ', ETA(), ' ', FileTransferSpeed()], maxval=1000000000).start()

with open('numlistbegin','w') as numlist:
    limit, nw, pu = 1000000000, numlist.write, pbar.update

    for x in range(limit):
        nw('%010d\n'%(x,))
        pu(x)
pbar.finish()

編集:したがって、(使用しているプログラミング言語に関係なく) フォーマットが膨大な量のオーバーヘッドを生み出すことを発見しました。Seqジョブは迅速に完了しますが、フォーマット オプション (-f) を使用するとさらに遅くなります。ただし、それでも Python ソリューションを提供したい場合は、大歓迎です。

4

2 に答える 2

3

FWIWseqには書式設定オプションがあります。

$ seq -f "%010g" 1 5
0000000001
0000000002
0000000003
0000000004
0000000005

あなたの長い時間は、記憶に関連している可能性があります。範囲が大きい場合、開始前に範囲全体を計算してメモリに保存しようとしないため、xrange を使用するとメモリ効率が向上します。Should you always favor xrange() over range()?というタイトルの投稿を参照してください。

編集: Python 3 を使用すると、xrange と range の使用は関係ありません。

于 2013-07-22T16:04:02.493 に答える