数字(1から10 136まで)を列挙したいのですが、これまで試してきたほとんどのツールとトリックは、10 9の周りの数字の後に問題が発生します。
以下は(小規模)いくつかの例です。
~のためseq 99999
real 0m0.056s
user 0m0.004s
sys 0m0.051s
~のためseq 9999999
real 1m5.550s
user 0m0.156s
sys 0m6.615s
など…問題は、9番目の数字(この場合は999999999)以降にのみ闘争が始まるということです。私はそれらをより小さな範囲に分けて並列に実行することを考えました。
cat <(seq 000 999) <(seq 999 1999) <(seq 1999 2999) <(seq 2999 3999) <(seq 3999 4999) <(seq 4999 5999) <(seq 5999 6999) <(seq 6999 7999) <(seq 7999 8999) <(seq 8999 9999) <(seq 9999 10999) <(seq 10999 11999) <(seq 11999 12999) <(seq 12999 13999) <(seq 13999 14999)
real 0m0.258s
user 0m0.008s
sys 0m0.908s
これはそれよりはるかに遅いです(特に広い範囲で)。
seq 000 14999
real 0m0.042s
user 0m0.000s
sys 0m0.041s
私はSOで見つけたこのPerlスクリプトを試しました。
#!/usr/bin/perl
use strict;
if ( ($#ARGV+1)!=2 ) { print "usage $0 \n"; }
my @r = &bitfizz( $ARGV[0], $ARGV[1] );
for(@r){ print "$_\n"; }
sub bitfizz() {
$_[0]=join( ",", split(//, $_[0] ) );
for( my $i=1; $i<=$_[1]; $i+=1 ) { $_=$_."{$_[0]}"; }
@r=glob( $_ );
}
seqよりも速いようですが(10 10perl script.pl "0123456789" 10*
未満の作業を実行すると)、それはまだ難しく、完了するのに時間がかかるようです...
列挙型の数字をファイルに書き込む必要はありませんが、処理できるように標準出力に入れる必要があります。
編集する:
@Isaacは彼の答え(そしてコメント)で何かを言及しました。できる動作し、言及されている他のものよりもはるかに速く10 10を通過しますが、10 10(そしてさらに10 136)よりも大きい場合は、まだ困難に直面しています。
この投稿の重複である可能性があるため、言及する価値があります(技術的にはそうではありません)。
GNU seqより0から10 136まで速く列挙する方法は何ですか?
ベストアンサー1
不可能。どのようにカットしても10 136を列挙する方法はありません。
約あります。観測可能な宇宙の原子10 80個、銃。すべての原子の力を活用する完全な並列化の限界を想像してみてください。各原子価数を出すのに100ピコ秒がかかる場合(これは現在のコンピュータよりもはるかに速い10GHzのクロック周波数を意味します)、次の結果が得られます。1秒あたり10から90の数字。この驚くべき速度でも、シーケンスを列挙するにはまだ10 46秒または約10秒かかります。10 38歳。私の考えでは、あなたがそう長く待つ準備ができていないと思います。