LINUX.ORG.RU

История изменений

Исправление beck, (текущая версия) :

Переписал по вашему совету с итератором файла. Однако суть в том, и я об этом писал раньше, что мне в итоге нужно было сравнить эти два массива, поэтому я их и собираю, а не просто выкинуть в файл найденные подстроки. Ну да ладно. Про сравнить пару массивов сделаю ещё один тест. )))

Итак, perl

my $time1 = gettimeofday; 
print "begin: ", $time1, "\n";
open(FP_01, "<$ARGV[0]") || die "Can not open $ARGV[0] file";
open(FP_02, "<$ARGV[1]") || die "Can not open $ARGV[1] file";
open(FP_RES, ">$ARGV[2]") || die "Can not open $ARGV[2] file";
while (<FP_01>) {
	print FP_RES substr($_, 3, 11) . "\n";
}
while (<FP_02>) {
	print FP_RES substr($_, 3, 11) . "\n";
}
close(FP_01);
close(FP_02);
close(FP_RES);
my $time2 = gettimeofday; 
print "end: ", $time2, "\n";

Запустил несколько раз, для усреднить результат:

begin: 1584348067.03854
end: 1584348067.38828

begin: 1584348102.90829
end: 1584348103.25905

begin: 1584348104.91495
end: 1584348105.28588

begin: 1584348138.61802
end: 1584348138.96772

Примерно ~0,35 секунды. Причём расхождение результатов 0,02.

Перейдем к питону:

t = datetime.now()
print(t.strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))
file_in_1 = open(sys.argv[1], 'r')
file_in_2 = open(sys.argv[2], 'r')
file_out = open(sys.argv[3], 'w')
for temp in file_in_1:
    print(temp[3:14], file=file_out)
for temp in file_in_2:
    print(temp[3:14], file=file_out)
file_in_1.close()
file_in_2.close()
file_out.close()
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))

Результаты:

2020-03-16 11:24:57.511136
2020-03-16 11:24:58.786507

2020-03-16 11:25:03.978829
2020-03-16 11:25:05.32895

2020-03-16 11:25:06.698896
2020-03-16 11:25:07.979156

2020-03-16 11:25:09.256597
2020-03-16 11:25:10.594978

2020-03-16 11:27:26.465951
2020-03-16 11:27:27.756798

Примерно ~ 1,3 секунды. А вот расхождение результатов 0,07.

Итого: Perl быстрее в 3,7 раза и к тоже показывает куда более стабильный результат. В общем, как и ожидалось, питон - так и не показал чудесной производительности.

ЗЫ убрал chomp из perl, он не нужен. )))

Исправление beck, :

Переписал по вашему совету с итератором файла. Однако суть в том, и я об этом писал раньше, что мне в итоге нужно было сравнить эти два массива, поэтому я их и собираю, а не просто выкинуть в файл найденные подстроки. Ну да ладно. Про сравнить пару массивов сделаю ещё один тест. )))

Итак, perl

my $time1 = gettimeofday; 
print "begin: ", $time1, "\n";
open(FP_01, "<$ARGV[0]") || die "Can not open $ARGV[0] file";
open(FP_02, "<$ARGV[1]") || die "Can not open $ARGV[1] file";
open(FP_RES, ">$ARGV[2]") || die "Can not open $ARGV[2] file";
while (<FP_01>) {
	print FP_RES substr($_, 3, 11) . "\n";
}
while (<FP_02>) {
	print FP_RES substr($_, 3, 11) . "\n";
}
close(FP_01);
close(FP_02);
close(FP_RES);
my $time2 = gettimeofday; 
print "end: ", $time2, "\n";

Запустил несколько раз, для усреднить результат:

begin: 1584348067.03854
end: 1584348067.38828

begin: 1584348102.90829
end: 1584348103.25905

begin: 1584348104.91495
end: 1584348105.28588

begin: 1584348138.61802
end: 1584348138.96772

Примерно ~0,35 секунды. Причём расхождение результатов 0,02.

Перейдем к питону:

t = datetime.now()
print(t.strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))
file_in_1 = open(sys.argv[1], 'r')
file_in_2 = open(sys.argv[2], 'r')
file_out = open(sys.argv[3], 'w')
for temp in file_in_1:
    print(temp[3:14], file=file_out)
for temp in file_in_2:
    print(temp[3:14], file=file_out)
file_in_1.close()
file_in_2.close()
file_out.close()
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))

Результаты:

2020-03-16 11:24:57.511136
2020-03-16 11:24:58.786507

2020-03-16 11:25:03.978829
2020-03-16 11:25:05.32895

2020-03-16 11:25:06.698896
2020-03-16 11:25:07.979156

2020-03-16 11:25:09.256597
2020-03-16 11:25:10.594978

2020-03-16 11:27:26.465951
2020-03-16 11:27:27.756798

Примерно ~ 1,3 секунды. А вот расхождение результатов 0,07.

Итого: Perl быстрее в 3,7 раза и к тоже показывает куда более стабильный результат.

ЗЫ убрал chomp из perl, он не нужен. )))

Исправление beck, :

Переписал по вашему совету с итератором файла. Однако суть в том, и я об этом писал раньше, что мне в итоге нужно было сравнить эти два массива, поэтому я их и собираю, а не просто выкинуть в файл найденные подстроки. Ну да ладно. Про сравнить пару массивов сделаю ещё один тест. )))

Итак, perl

my $time1 = gettimeofday; 
print "begin: ", $time1, "\n";
open(FP_01, "<$ARGV[0]") || die "Can not open $ARGV[0] file";
open(FP_02, "<$ARGV[1]") || die "Can not open $ARGV[1] file";
open(FP_RES, ">$ARGV[2]") || die "Can not open $ARGV[2] file";
while (<FP_01>) {
	chomp;
	print FP_RES substr($_, 3, 11) . "\n";
}
while (<FP_02>) {
	chomp;
	print FP_RES substr($_, 3, 11) . "\n";
}
close(FP_01);
close(FP_02);
close(FP_RES);
my $time2 = gettimeofday; 
print "end: ", $time2, "\n";

Запустил несколько раз, для усреднить результат:

begin: 1584346540.25037
end: 1584346540.60583

begin: 1584346750.79239
end: 1584346751.14869

begin: 1584346785.73511
end: 1584346786.09154

begin: 1584346856.92943
end: 1584346857.28393

Примерно ~0,36 секунды. Причём расхождение результатов 0,02.

Перейдем к питону:

t = datetime.now()
print(t.strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))
file_in_1 = open(sys.argv[1], 'r')
file_in_2 = open(sys.argv[2], 'r')
file_out = open(sys.argv[3], 'w')
for temp in file_in_1:
    print(temp[3:14], file=file_out)
for temp in file_in_2:
    print(temp[3:14], file=file_out)
file_in_1.close()
file_in_2.close()
file_out.close()
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))

Результаты:

2020-03-16 11:24:57.511136
2020-03-16 11:24:58.786507

2020-03-16 11:25:03.978829
2020-03-16 11:25:05.32895

2020-03-16 11:25:06.698896
2020-03-16 11:25:07.979156

2020-03-16 11:25:09.256597
2020-03-16 11:25:10.594978

2020-03-16 11:27:26.465951
2020-03-16 11:27:27.756798

Примерно ~ 1,3 секунды. А вот расхождение результатов 0,07.

Итого: Perl быстрее в 3,6 раза и к тоже показывает куда более стабильный результат.

Исходная версия beck, :

Переписал по вашему совету с итератором файла. Однако суть в том, и я об этом писал раньше, что мне в итоге нужно было сравнить эти два массива, поэтому я их и собираю, а не просто выкинуть в файл найденные подстроки. Ну да ладно. Про сравнить пару массивов сделаю ещё один тест. )))

Итак, perl

my $time1 = gettimeofday; 
print "begin: ", $time1, "\n";
open(FP_01, "<$ARGV[0]") || die "Can not open $ARGV[0] file";
open(FP_02, "<$ARGV[1]") || die "Can not open $ARGV[1] file";
open(FP_RES, ">$ARGV[2]") || die "Can not open $ARGV[2] file";
while (<FP_01>) {
	chomp;
	print FP_RES substr($_, 3, 11) . "\n";
}
while (<FP_02>) {
	print FP_RES substr($_, 3, 11) . "\n";
}
close(FP_01);
close(FP_02);
close(FP_RES);
my $time2 = gettimeofday; 
print "end: ", $time2, "\n";

Запустил несколько раз, для усреднить результат:

begin: 1584346540.25037
end: 1584346540.60583

begin: 1584346750.79239
end: 1584346751.14869

begin: 1584346785.73511
end: 1584346786.09154

begin: 1584346856.92943
end: 1584346857.28393

Примерно ~0,36 секунды. Причём расхождение результатов 0,02.

Перейдем к питону:

t = datetime.now()
print(t.strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))
file_in_1 = open(sys.argv[1], 'r')
file_in_2 = open(sys.argv[2], 'r')
file_out = open(sys.argv[3], 'w')
for temp in file_in_1:
    print(temp[3:14], file=file_out)
for temp in file_in_2:
    print(temp[3:14], file=file_out)
file_in_1.close()
file_in_2.close()
file_out.close()
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0'))

Результаты:

2020-03-16 11:24:57.511136
2020-03-16 11:24:58.786507

2020-03-16 11:25:03.978829
2020-03-16 11:25:05.32895

2020-03-16 11:25:06.698896
2020-03-16 11:25:07.979156

2020-03-16 11:25:09.256597
2020-03-16 11:25:10.594978

2020-03-16 11:27:26.465951
2020-03-16 11:27:27.756798

Примерно ~ 1,3 секунды. А вот расхождение результатов 0,07.

Итого: Perl быстрее в 3,6 раза и к тоже показывает куда более стабильный результат.