Как я могу написать следующее эффективным образом:Напишите два вывода циклов в двух столбцах в оболочке?
for j in {1..339};do
for i in {1..427};do
echo -e $j'\t'$i >> ofile.txt
done
done
Как я могу написать следующее эффективным образом:Напишите два вывода циклов в двух столбцах в оболочке?
for j in {1..339};do
for i in {1..427};do
echo -e $j'\t'$i >> ofile.txt
done
done
Переместите переназначения на внешнюю петлю так ofile.txt
только открыт один раз.
for j in {1..339}; do
for i in {1..427}; do
echo -e "$j\t$i"
done
done >> ofile.txt
Это, вероятно, также лучше использовать C-стиль для петли, чтобы предотвратить эти фигурные скобки от необходимости быть расширен, хотя я не профилированного его. Это меньшая оптимизация.
for ((j = 1; j <= 339; ++j)); do
for ((i = 1; i <= 427; ++i)); do
echo -e "$j\t$i"
done
done >> ofile.txt
perl -e '
for my $j (1..339) {
for my $i (1..427) {
print "$j\t$i\n";
}
}
' > ofile.txt
здесь одна альтернатива без явных петель
join -j9 -t$'\t' <(seq 339) <(seq 427) | cut -f2- > ofile.txt
awk 'BEGIN {
OFS="\t"
for (j=1;j<=339;j++) {
for (i=1;i<=427;i++) {
print j, i
}
}
}' > ofile.txt
Karakfa «s меня ThOD, без сократить:
join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt
контрольные показатели, используя Баш «s встроенной времени команды, только 'реальный' номер, (который разнится несколько от системы к системе, мой процессор около 4390 BogoMips):
Takeaway : join обеспечивает 100-кратное ускорение.
POSIX оболочки, с SEQ:
#!/bin/dash
for j in `seq 339`;do
for i in `seq 427`;do
echo $j\\\t$i
done
done > ofile.txt
cat my.c
#include <stdio.h>
#include <stdlib.h>
main(n,s)int n; char **s;{
int i, j;
if(n!=3)exit(1);
for(i=1; i<=atoi(s[1]); i++)
for(j=1; j<=atoi(s[2]); j++)
printf("%4d %4d\n",i,j);
}
gcc my.c -o my
time ./my 339 427 >ofile.txt
real 0m0.035s
user 0m0.024s
sys 0m0.008s
cat karakfa_agc_solution
join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt
time ./karakfa_agc_solution >ofile.txt
real 0m0.032s
user 0m0.012s
sys 0m0.008s
cat /proc/cpuinfo |grep bogo
bogomips : 6629.54
Я не мог сделать более быстрый код в C также.
Компиляция в моей системе (Intel Core i3-2330M) выполняется на 2 или 3 раза медленнее, чем * join *. Ваша коробка должна иметь другую архитектуру или лучшие настройки компилятора по умолчанию - возможно, есть несколько менее относительных эталонных инструментов. В любом случае это: '#include
Проверенный источник: для вывода * join * uses * putchar() *, * fputs() * и * fwrite() *. – agc
Мой процессор: AMD Phenom (tm) II X2 560 Процессор (3,3 ГГц) –
Существует немного более быстрый код C с функцией fwrite() и с таблицей кодов ASCII (ref to @agc).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L 6 // max digit
main(n,s)int n; char **s;{
unsigned int i, j, k, m1, m2, mx;
char *p;
if(n!=3){printf("Usage %s num1 num2\n", s[0]); exit(__LINE__);}
m1=atoi(s[1]); m2=atoi(s[2]);
if(!(m1*m2)|| strlen(s[1])>L|| strlen(s[2])>L)exit(__LINE__);
mx=m1>m2?m1:m2; // max input num
// allocate and init ASCII code tbl for the bigest inp oper
if(!(p=(char *)malloc((mx+1)*(L+2))))exit(__LINE__);
if(!memset(p, ' ', (mx+1)*(L+2)))exit(__LINE__);
for(i=1; i<=mx; i++){
for(j=i,k=L-1; j; j/=10,k--)p[i*(L+2)+k]=j%10+'0';
p[i*(L+2)+L]='\t'; p[i*(L+2)+L+1]='\n';}
for(i=1; i<=m1; i++) //print variants from ASCII tbl
for(j=1; j<=m2; j++){
fwrite(p+(L+2)*i, L+1, 1,stdout);
fwrite(p+(L+2)*j, L+2, 1,stdout);}
}
gcc -o optf optf.c
time ./optf 339 427 >ofile.txt
real 0m0.010s
user 0m0.004s
sys 0m0.004s
bogomips :6629
architecture:AMD Phenom(tm) II X2 560
'done> ofile.txt' может быть больше того, что предполагал ОП, но он не уточнил. – agc