Вы можете наследовать от Array
и создать свой собственный класс, который эмулировал многомерный массив (но внутренне был простым одномерным массивом).Вы можете увидеть некоторое ускорение, но трудно сказать, не написав код в обоих направлениях и не профилировав его.
Возможно, вы захотите поэкспериментировать с классом NArray .
Несмотря на это, ваш поиск во вложенных массивах может не быть реальным узким местом, которым они кажутся.Несколько раз у меня возникала та же проблема, а потом выяснилось, что переписывание части моей логики устранило узкое место.Это больше, чем просто ускорение вложенных поисков, речь идет о минимизации необходимого количества поисков.Каждый «произвольный доступ» в n
-мерном массиве требует n
поисков (по одному на уровень вложенного массива).Вы можете уменьшить это, перебирая измерения, используя код, подобный следующему:
array.each {|x|
x.each {|y|
y.each {|z|
...
}
}
}
Это позволяет вам выполнить один поиск в первом измерении, а затем получить доступ ко всему «позади», а затем один поиск во втором.измерение и т. д. и т. д. Это приведет к значительно меньшему количеству поисков, чем к случайному доступу к элементам.
Если вам нужен произвольный доступ к элементам, вы можете вместо этого попробовать использовать хеш.Вы можете взять индексы массива, объединить их вместе в виде строки и использовать их в качестве хэш-ключа (например, array[12][0][3]
становится hash['0012_0000_0003']
).Это может привести к более быстрому «произвольному доступу», но вы бы наверняка захотели его профилировать.
Есть ли шанс, что вы сможете опубликовать свой проблемный код?Знание кода проблемы поможет нам порекомендовать решение.