Что не так с просто
@data = Array.new(7) { Array.new(24) { 'something' }}
Или, если у вас есть контент, имеющий везде одинаковый объект 1005 *:
@data = Array.new(7) { Array.new(24, 'something') }
Это намного быстрее, не то чтобы это имело значение. Он также гораздо более читабельный, что является наиболее важным. В конце концов, целью кода является передача намерений другим заинтересованным сторонам, , а не , общение с компьютером.
user system total real
method1 8.969000 0.000000 8.969000 ( 9.059570)
method2 16.547000 0.000000 16.547000 (16.799805)
method3 6.468000 0.000000 6.468000 ( 6.616211)
method4 0.969000 0.015000 0.984000 ( 1.021484)
В этой последней строке также показана другая интересная вещь: во время выполнения преобладает время, необходимое для создания 7 * 24 * 100000 = 16,8 миллиона
'something'
строк.
И, конечно, есть еще одно важное замечание: ваши method1
и method2
, которые вы сравниваете друг с другом, делают две совершенно разные вещи! Даже не имеет смысла сравнивать их друг с другом. method1
создает Array
, method2
создает Hash
.
Ваш method1
эквивалентен моему первому примеру выше:
@data = Array.new(7) { Array.new(24) { 'something' }}
Хотя method2
( очень примерно) эквивалентно:
@data = Hash.new {|h, k| h[k] = Hash.new {|h, k| h[k] = 'something' }}
Хорошо, за исключением того, что ваш method2
инициализирует весь Hash
с нетерпением, в то время как мой метод выполняет код инициализации только лениво в случае чтения неинициализированного ключа.
Другими словами, после запуска приведенного выше кода инициализации, Hash
все еще пуст:
@data # => {}
Но всякий раз, когда вы пытаетесь получить доступ к ключу, он волшебным образом появляется:
@data[5][17] # => 'something'
И он останется там:
@data # => {5 => {17 => 'something'}}
Поскольку этот код на самом деле не инициализирует Hash
, он, очевидно, намного быстрее:
user system total real
method5 0.266000 0.000000 0.266000 ( 0.296875)