Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать количество ключей в большом хеше? есть ли способ быстрее $c += keys %hash 
:(
    Опции темы
Suppir
Дата 18.7.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Добрый день!

Если ли способ узнать количество ключей в большом хеше (несколько миллионов ключей)
без его перебора с помощью $c += keys %hash   ?



PM MAIL   Вверх
MaXL
Дата 19.7.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Что-то мне кажется что в скалярном контексте не будут перебираться все ключи хэша,
и всё должно очень быстро отработать. Ведь однозначно Perl во внутреннем строении
своего хэша где-то хранить кол-во ключей.
Цитата

Returns a list consisting of all the keys of the named hash, or the indices of an array. (In scalar context, returns the number of keys or indices.)

Один только вопрос. что лучше использовать явный скалярный контекст:
Код

$c += scalar keys %hash

или неявный:
Код

$c += keys %hash



--------------------
MaXL
PM MAIL   Вверх
sir_nuf_nuf
Дата 19.7.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(MaXL @  19.7.2010,  14:19 Найти цитируемый пост)
явный скалярный контекст


Цитата(MaXL @  19.7.2010,  14:19 Найти цитируемый пост)
или неявный:


без разницы.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Suppir
Дата 19.7.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



У массива @array можно узнать количество элементов следующим образом:
$elements = $#array;

Может быть что-то есть у хешей аналогичное?



Еще момент. Как вы думаете, что быстрее работает: перебор хеша через foreach $key(keys %hash) или через each ?
Я где-то читал, что foreach медленней будет работать, потому что для него сначала строится все пары, а потом отсеиваются values.

PM MAIL   Вверх
sir_nuf_nuf
Дата 19.7.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(Suppir @  19.7.2010,  15:49 Найти цитируемый пост)
Может быть что-то есть у хешей аналогичное?

да:
Код

$size = scalar keys %hash;

Это не создает никаких дополнительных массивов. Perl оптимизирует такую конструкцию и просто возвращает вам число ключей.
(Да оно хранится в структуре хэша, но доступ к нему можно получить только так (почти только так, есть еще один недо-способ))


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
MaXL
Дата 19.7.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата(Suppir @  19.7.2010,  15:49 Найти цитируемый пост)
Как вы думаете, что быстрее работает: перебор хеша через foreach $key(keys %hash) или через each ?

Думаю одинаково. Почитай описание цикла foreach, и посмотрите как такой же цикл может написать "C programmer" и как "Perl programmer".
Цитата(Suppir @  19.7.2010,  15:49 Найти цитируемый пост)
Я где-то читал, что foreach медленней будет работать, потому что для него сначала строится все пары, а потом отсеиваются values.

А где это вы читали ? Вообще foreach как раз таки сделан чтобы перебирать массивы и хэши.
Я уверен что он максимально оптимизирован под это.


--------------------
MaXL
PM MAIL   Вверх
Suppir
Дата 19.7.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Цитата(MaXL @  19.7.2010,  16:43 Найти цитируемый пост)
А где это вы читали


Читал в другом месте, но вот еще пример обнаружил:
http://xeim.blogspot.com/2007/11/perl.html


each работает в 2 раза быстрее, чем foreach
а map работает в 3 раза быстрее, чем foreach
PM MAIL   Вверх
KSURi
Дата 19.7.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(sir_nuf_nuf @  19.7.2010,  16:12 Найти цитируемый пост)
Perl оптимизирует такую конструкцию и просто возвращает вам число ключей

О, а можно ссылочку на упоминание оптимизации?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Suppir
Дата 19.7.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Сейчас потестил - нифига не быстрее each работает. Примерно так же, даже помедленней чем foreach. 
Стоит ActivePerl 5.10.1
PM MAIL   Вверх
MaXL
Дата 19.7.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата

О, а можно ссылочку на упоминание оптимизации? 

так ведь в perldoc написано что возвращает функция
в скалярном контексте. Я думаю глупо было бы её реализовывать тупым перебором всех элементов.


--------------------
MaXL
PM MAIL   Вверх
sir_nuf_nuf
Дата 19.7.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(KSURi @  19.7.2010,  19:08 Найти цитируемый пост)
О, а можно ссылочку на упоминание оптимизации? 

пожалуй что нет. Но судя по расходу памяти в эксперименте, промежуточный массив не создается.

Вот скрипт:

Код

%h = ();
while ($i++ < 1000000) {
    $h{'valuewewerwefwef_' . $i} = $i;
}
print "Press a key\n";
$x = <>;

$s = scalar keys %h;
print "Size is $s\nPress a key\n";
$x = <>;


my @z = keys %h;
print "Copy size is $#z\nPress a key\n";
$x = <>;




--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.