Давайте выясним:
In [8]: def with_assignment(arr, x, y):
...: a = arr[x][y]
...: return a
...:
In [9]: dis.dis(with_assignment)
2 0 LOAD_FAST 0 (arr)
3 LOAD_FAST 1 (x)
6 BINARY_SUBSCR
7 LOAD_FAST 2 (y)
10 BINARY_SUBSCR
11 STORE_FAST 3 (a)
3 14 LOAD_FAST 3 (a)
17 RETURN_VALUE
In [10]: def without_assignment(arr, x, y):
....: return arr[x][y]
....:
In [11]: dis.dis(without_assignment)
2 0 LOAD_FAST 0 (arr)
3 LOAD_FAST 1 (x)
6 BINARY_SUBSCR
7 LOAD_FAST 2 (y)
10 BINARY_SUBSCR
11 RETURN_VALUE
Итак, добавление присваивания добавляет две инструкции байт-кода, a STORE_FAST
и LOAD_FAST
. Таким образом, строго говоря, использование значения напрямую быстрее. Но на сколько?
In [34]: arr = [range(100) for _ in xrange(1000)]
In [35]: %timeit without_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 9.75 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.83 µs per loop
In [36]: %timeit with_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 10.57 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.8 µs per loop
Итак, для относительно небольших массивов кажется, что разница составляет несколько микросекунд. Если вы пытаетесь сделать свой код более эффективным, это, вероятно, не является узким местом.
Если вы собираетесь повторно использовать значение, очевидно, сохраните его, чтобы вам не приходилось пересчитывать его.
Это кажется, что Вы находитесь в состоянии, где производственная схема дб точно не соответствует тому, что Вы используете в dev (хотя это не полностью ясно). Я чертил бы линию в песке и получил бы тот дб напоминания в лучшем состоянии. По существу то, что Вы хотите сделать, удостоверяются, что дб напоминания имеет "schema_info" таблицу, которая перечисляет любые миграции, которые Вы> не делаете <когда-либо хотят работать в производстве. Затем можно добавить миграции к содержанию основ, и они будут работать против производственного дб.
После того как Вы сделали это, можно записать миграции, которые добавляют изменения схемы или добавляют данные, но одна вещь, относительно которой необходимо быть действительно осторожны, состоит в том, что, если Вы добавляете данные с помощью миграции, необходимо определить модель в рамках самой миграции, как это:
class AddSomeColumnsToUserTable < ActiveRecord::Migration
class User < ActiveRecord::Base; end
def self.up
add_column :users, :super_cool, :boolean, :default => :false
u = User.find_by_login('cameron')
u.super_cool = true
u.save
end
def self.down
remove_column :users, :super_cool
end
end
Причина этого состоит в том, что в будущем, Вы могли бы удалить модель в целом, во время некоторого рефакторинга или другого. Если Вы не определите пользовательский класс на строке "Пользователь find_by_login..." миграция, то выдаст исключение, которое является большой болью.
Я всегда выполняю эту процедуру:
Существует ли причина, Вы не используете те же миграции, которые Вы использовали в своей dev среде?
Добавление столбца с add_column
в миграции должно быть неразрушающим: это генерирует оператор "ALTER TABLE". Если Вы знаете то, что Вы собираетесь поместить в столбцы, однажды созданные, можно заполнить значения в рамках миграции (можно выбрать менее трудоемкую альтернативу, если количества строки являются большими).
Удаление или изменение определения столбца, я думаю, зависимый платформы: некоторые позволят удаление столбца на месте, другие выполнят rename-create-select-drop последовательность команд.
Для получения более конкретными нам нужно больше информации: на какую миграцию Вы смотрите, на какой платформе Вы работаете, Вам нужно к установленным значениям как часть миграции? Материал как этот помог бы много - просто редактируют вопрос, который пододвинет его обратно список.