Новые кодеры иногда пишут такой код:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
Затем кодер остается с кучей именованных переменных с усилием кодирования O ( m * n ), где m - это число именованных переменных, а n - это количество раз, к которому необходимо получить доступ к группе переменных (включая создание) , Более проницательный новичок отмечает, что единственная разница в каждой из этих строк - это число, которое изменяется на основе правила и решает использовать цикл. Тем не менее, они зациклились на том, как динамически создавать эти имена переменных, и могут попробовать что-то вроде этого:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
Вскоре они обнаруживают, что это не сработает.
Если программа требует произвольных переменных «имена», лучше всего подходит словарь, как объясняется в других ответах. Однако, если вы просто пытаетесь создать много переменных, и вы не возражаете ссылаться на них с последовательностью целых чисел, вы, вероятно, ищете list
. Это особенно верно, если ваши данные однородны, например, ежедневные показания температуры, еженедельные оценки викторины или сетка графических виджета.
Это можно собрать следующим образом:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
Этот list
также может быть создан в одной строке с пониманием:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
Результат в любом случае - это заполненный list
, с первым элементом, к которому обращаются с помощью my_calculator.buttons[0]
, следующего с my_calculator.buttons[1]
и т. д. Имя переменной «base» становится именем list
, и для доступа к нему используется различный идентификатор.
Наконец, не забудьте другие структуры данных, такие как set
- это аналогично словарю, за исключением того, что каждое «имя» не имеет привязанного к нему значения. Если вам просто нужна «сумка» объектов, это может быть отличным выбором. Вместо этого:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
У вас будет следующее:
keywords = {'apple', 'banana'}
if query in keywords:
print('Match.')
Используйте последовательность list
для последовательности похожих объектов, a set
для произвольного - помещенный пакет предметов или dict
для мешка с именами со связанными значениями.
Вы можете заставить компилятор JIT скомпилировать весь набор сборок во время процедуры инициализации вашего приложения, используя метод PrepareMethod
... (без использования NGen
).
Это решение более подробно описано здесь: Принуждение компиляции JIT во время выполнения .
Если вы считаете, что на вас воздействует JIT, перекомпилируйте приложение NGEN и снова запустите тесты. В коде отсутствует JIT-код, который был скомпилирован NGEN. Если вы все еще видите всплески в приложении NGEN'd, то вы знаете, что они не вызваны JIT.
Как отметил Марк, продолжающиеся шипы не звучат как проблемы JIT. Другие вещи, которые нужно искать:
Изменить:
Даже если вы Не хотите использовать NGen, по крайней мере сравните версию NGen'd, чтобы вы могли видеть, какая разница JITing делает
Начальная скорость действительно звучит как Fusion + JIT, чему может помочь ILMerge (для Fusion) и NGEN (для JIT); вы всегда можете играть безмолвную дорожку через систему при запуске, чтобы это выполняло всю тяжелую работу без того, чтобы пользователь заметил какие-либо искажения?
NGEN - хороший вариант; есть ли причина , которую вы не можете использовать?
Проблемы, которые вы упоминаете после , не имеют такой же начальной нагрузки, как и JIT. Возможно, сбор мусора.
Вы пробовали профилирование? И CPU и память (коллекции)?