Форум программистов, компьютерный форум, киберфорум
Наши страницы
Perl
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
fandd
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 2
1

Есть ли лучшая альтернатива решения задачи?

28.01.2015, 15:47. Просмотров 542. Ответов 12
Метки нет (Все метки)

Есть строка формата :
005555,0 ,000000,000,09,22204545000 ,33363837355 ,33365765574 , ,00,28012015075753,28012017097542,280120157937742....

которая передается в переменной $b и после обрезания сравнивается с выделенной красной частью, и так каждая строка с файла.
...
if (substr($b,64,3) eq '333')
...

Вопрос: можно ли реализовать это по другому (лучше)?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2015, 15:47
Ответы с готовыми решениями:

Есть ли короткий путь решения задачи?
Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны. ...

Есть ли какой паттерн для решения подобной задачи?
у меня есть абстрактный класс, для фигур. он имеет метод для записи в файл, который переопределяет...

Есть ли более простой и оптимальный способ решения данной задачи?
Добрый день! Ситуация следующая: Есть класс Event. public class Event { public string...

Сделать алгоритм решения задачи (описание), есть программа и блок схема
Program abc; var a:array of integer; i,temp,change:integer; begin randomize; writeln(‘исходный...

Кригинг - есть ли библиотеки для решения данной задачи за более "быстрое" время
Реализован кригинг, но решается за длительное время, особенно в 3d-пространстве. Есть ли библиотеки...

12
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
28.01.2015, 16:01 2
лучше чем что? по скорости substr быстрее регулярного выражения.

Добавлено через 8 минут
и если задача состоит в проверке символов, с 64-го по 67-й, то лучше и не придумать.

вот разве что ещё unpack сравним по скорости.
0
Dmitriy_M
1435 / 1315 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 01:54 3
Вряд ли. pack/unpack для работы с двоичными структурами.
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
01.02.2015, 02:42 4
TC всё равно исчез ( похитили? ),
поэтому можно, конечно, поспорить на эту тему,
но жаркой дискуссии не получится,
потому что и в популярных книжках с картинками,
и в сухой документации написано, как использовать
pack / unpack для работы с текстом.
0
01.02.2015, 02:42
Dmitriy_M
1435 / 1315 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 14:10 5
volodin661, с текстом или с последовательностью байт?
Perl
1
2
3
my $str = '005555,0 ,000000,000,09,22204545000 ,33363837355 ,33365765574 , ,00,28012015075753,28012017097542,280120157937742';
my (undef, $val) = unpack "A[37]A[3]", $str;
say $val;
Сравнимо с забиванием гвоздей микроскопом.
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
01.02.2015, 15:43 6
вот так - забивание гвоздя молотком:
Perl
1
perl -E '$_="005555,0 ,000000,000,09,22204545000 ,3336"; if(substr($_,37,3) eq "333") { say "OK"}'
а вот так микроскопом?
Perl
1
perl -E '$_="005555,0 ,000000,000,09,22204545000 ,3336"; if((unpack"A37A3")[1] eq "333") { say "OK"}'
учитывая, что unpack быстрее substr



Код
а если предположить, что надо было 4-5 подстрок разной длины  вытянуть из фиксированных колонок:

$line = "1 00555,00;98;7823414;74646;228,27272.26262.fffe;343567;9876;ABC";
             ^              ^                        ^                ^
-------------               |                        |                |
-----------------------------                        |                |
-----------------------------------------------------                 |
-----------------------------------------------------------------------

смещение/длина: 4/3, 30/2, 54/3, 72/2
молоток?
Perl
1
2
3
4
my $col1 = substr( $line, 4,  3 );
my $col2 = substr( $line, 30, 2 );
my $col3 = substr( $line, 54, 3 );
my $col4 = substr( $line, 72, 2 );
майкроскоп?
Perl
1
 my @cols = (unpack("A4A3 A23A2 A23A3 A15A2", $line))[1,3,5,7];
1
fandd
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 2
01.02.2015, 18:59  [ТС] 7
ТС не исчез, просто выходные Спасибо за примеры. Но все же если unpack работает быстрее и мне как раз это нужно, в чем минус реализации ''забиванием гвоздя микроскопом"?
0
Dmitriy_M
1435 / 1315 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.02.2015, 23:06 8
Цитата Сообщение от volodin661 Посмотреть сообщение
учитывая, что unpack быстрее substr
По моим тестам наоборот.
Цитата Сообщение от volodin661 Посмотреть сообщение
а если предположить, что надо было 4-5 подстрок разной длины вытянуть из фиксированных колонок:
Человек предполагает, а Бог располагает. Давайте не будем строить предположения.
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
02.02.2015, 12:54 9
оставь бога в покое, ему сейчас есть чем заняться;

подобный benchmark есть в stackoverflow (http://stackoverflow.com/questions/1...er-than-substr)
проверил и сам, подтвердилось:

сам по себе ( в void контексте ) unpack быстрее, но на присвоении результата ( копировании строк )
теряет очень много, поэтому в конечном итоге ( на моем примере конкретно ) получается в 2-4 раза медленнее.
0
Dmitriy_M
1435 / 1315 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
02.02.2015, 13:26 10
Цитата Сообщение от volodin661 Посмотреть сообщение
получается в 2-4 раза медленнее.
что и требовалось доказать.

Добавлено через 24 минуты
О том, что тестировать в void контексте некорректно написано во втором посте.

Забавно, что при конфигурации
Код
This is perl 5, version 14, subversion 2 (v5.14.2) built for i486-linux-gnu-thread-multi-64int
В void контексте получил
Код
           Rate substr unpack
substr 830875/s     --   -13%
unpack 955733/s    15%     --
100
           Rate substr unpack
substr  98248/s     --    -8%
unpack 107325/s     9%     --
1000
          Rate substr unpack
substr 10048/s     --    -9%
unpack 11060/s    10%     --
10000
         Rate substr unpack
substr 1004/s     --    -9%
unpack 1104/s    10%     --
100000
        Rate substr unpack
substr 100/s     --    -9%
unpack 110/s    10%     --
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
02.02.2015, 15:50 11
С Юникодом и большим числом извлечений

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use utf8;
use strict;
use warnings;
use Benchmark;
 
#количество колонок для извлечения
my $NN = shift || 5000;
 
my $str = "ФЫВ#" x $NN;
my @cols;
 
 
my $format = "A3A1" x $NN;
 
my @indexes;
 
for( my($n,$k)=(0,0); $n<$NN; $n+=1, $k+=2 ) {
        push @indexes, $k;
}
 
my %methods = (
    unpack  => sub {
 
                @cols = (unpack $format, $str)[@indexes];
            return \@cols;
        },
 
    substr => sub {
            for( my($n,$k)=(0,0); $n<$NN; ++$n, $k+=4 ) {
                    $cols[$n] = substr( $str, $k, 3);
            }
            return \@cols;
        }
);
 
print $NN;
 
Benchmark::cmpthese -1, \%methods;
Benchmark::timethese -1, \%methods;
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
10000
         Rate substr unpack
substr 8.62/s     --   -95%
unpack  181/s  1997%     --
Benchmark: 
running
 substr, unpack
 for at least 1 CPU seconds
...
 
    substr:  1 wallclock secs ( 1.04 usr +  0.00 sys =  1.04 CPU) @  8.65/s (n=9)
 
    unpack:  1 wallclock secs ( 1.09 usr +  0.00 sys =  1.09 CPU) @ 180.73/s (n=197)
1C
1
2
на 10 000 извлечений unpack выигрывает с преимуществом в 20 раз 
на 1-ом извлечении проигрывает в 2 раза
0
Dmitriy_M
1435 / 1315 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
02.02.2015, 16:18 12
volodin661, а теперь уже подменяете задачу. Исходная задача ставилась выдрать значение из середины строки, а не распаковать данные!
Юникод или Utf8?
Для utf8 такой формат A3A1 некорректный, размер символа от 1 до 6 байт;
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,372
02.02.2015, 16:45 13
Задачу я не подменяю, все про задачу ТС я написал в своем первом посте,
дальнейшее обсуждение идет по поводу сравнения скорости substr и unpack
в различных случаях;
один из таких гипотетических случаев, а именно множественное
извлечение из одной строки, я снабдил тестом по скорости и привел его здесь.

что-то осталось непонятно ?

А про юникод и unpack все написано в документации, на другие источники я и не ссылаюсь.

Так вот, Perl - это не PHP, поэтому заявленная поддержка юникода там реализована прозрачно во всех
функциях и если я пишу формат "A" при режиме use utf8, то это означает именно character mode,
а не byte mode и будет работать вне зависимости от физически выделенных байт

Bash
1
perl -Mutf8 -CS -E 'say "АЯ"' |  perl -CS -ne 'printf "%v04X\n", $_ for unpack("A*", $_)'
0
02.02.2015, 16:45
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2015, 16:45

GETS: есть ли альтернатива?
Ходят слухи, что функция get опасна (кому интересно, эта тема есть на форуме, чуть раньше). Есть...

Есть ли альтернатива Compiz?
Доброго дня всем! собственно вопрос: установлен Debian 7.1 x64 (Xfce) , есть ли какая замена...

Есть ли альтернатива фреймам
При создании сайта возникла следующая проблема - страница разбита на три фрейма. 1 - заголовок. 2 -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.