![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Добрый день!
Если ли способ узнать количество ключей в большом хеше (несколько миллионов ключей) без его перебора с помощью $c += keys %hash ? |
|||
|
||||
| MaXL |
|
||||||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
Что-то мне кажется что в скалярном контексте не будут перебираться все ключи хэша,
и всё должно очень быстро отработать. Ведь однозначно Perl во внутреннем строении своего хэша где-то хранить кол-во ключей.
Один только вопрос. что лучше использовать явный скалярный контекст:
или неявный:
-------------------- MaXL |
||||||
|
|||||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
без разницы. |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
У массива @array можно узнать количество элементов следующим образом:
$elements = $#array; Может быть что-то есть у хешей аналогичное? Еще момент. Как вы думаете, что быстрее работает: перебор хеша через foreach $key(keys %hash) или через each ? Я где-то читал, что foreach медленней будет работать, потому что для него сначала строится все пары, а потом отсеиваются values. |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
да:
Это не создает никаких дополнительных массивов. Perl оптимизирует такую конструкцию и просто возвращает вам число ключей. (Да оно хранится в структуре хэша, но доступ к нему можно получить только так (почти только так, есть еще один недо-способ)) |
|||
|
||||
| MaXL |
|
||||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
Думаю одинаково. Почитай описание цикла foreach, и посмотрите как такой же цикл может написать "C programmer" и как "Perl programmer".
А где это вы читали ? Вообще foreach как раз таки сделан чтобы перебирать массивы и хэши. Я уверен что он максимально оптимизирован под это. -------------------- MaXL |
||||
|
|||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Читал в другом месте, но вот еще пример обнаружил: http://xeim.blogspot.com/2007/11/perl.html each работает в 2 раза быстрее, чем foreach а map работает в 3 раза быстрее, чем foreach |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
О, а можно ссылочку на упоминание оптимизации? -------------------- Died at Life.pl line 21 |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Сейчас потестил - нифига не быстрее each работает. Примерно так же, даже помедленней чем foreach.
Стоит ActivePerl 5.10.1 |
|||
|
||||
| MaXL |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
так ведь в perldoc написано что возвращает функция в скалярном контексте. Я думаю глупо было бы её реализовывать тупым перебором всех элементов. -------------------- MaXL |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
пожалуй что нет. Но судя по расходу памяти в эксперименте, промежуточный массив не создается. Вот скрипт:
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |