Абсолютно возможно. Я хотел бы предложить сделать это так:
{('column_%d' % i): index[i:81:9] for i in xrange(9)}
Также первый список понимание не совсем нужен как раз делает:
index = range(0,81)
бы сделать то же самое.
Вы также можете заменить все разрезы списка на xranges, которые будут генерировать только нужные значения. Вы можете сделать это так:
{('column_%d' % i): range(i,81, 9) for i in xrange(9)}
Поскольку функция диапазона в python принимает параметр шага. См. the docs.
При этом, несмотря на то, что это выглядит более изящным, вы делаете ударный удар по разрезанию, что, вероятно, ухудшится при более широком понимании. При таком размере это не заметно:
import timeit
>>> timeit.timeit("{('column_%d' % i): range(i,81, 9) for i in xrange(9)}", number = 100000)
1.3790168762207031
>>> timeit.timeit("index=range(0,81);{('column_%d' % i): index[i:81:9] for i in xrange(9)}", number = 100000)
1.1949927806854248
Очевидно, форматирование строки здесь медленнее, чем я думал. Как отметил Мартино вы можете получить значительное увеличение скорости с помощью конкатенации вместо:
>>> timeit.timeit("{('column_' + str(i)): range(i,81,9) for i in xrange(9)}", number = 100000)
0.914525032043457
Однако при больших значениях i
она начинает становиться значительным:
>>> timeit.timeit("{('column_%d' % i): range(i,81, 9) for i in xrange(90)}", number = 100000)
12.220430135726929
>>> timeit.timeit("index=range(0,81);{('column_%d' % i): index[i:81:9] for i in xrange(90)}", number = 100000)
9.669343948364258
>>> timeit.timeit("index=range(0,81);{('column_' + str(i)): index[i:81:9] for i in xrange(90)}", number = 100000)
7.163957118988037
Большое спасибо. Последующий вопрос: строго ли требуется нарезка индекса, или есть ли понимание списка, которое будет делать то же самое? – TravMatth
@TravM на самом деле, вы можете напрямую использовать диапазон для такого рода вещей. См. Обновленный ответ. –
Эффект, связанный с разрезанием, уравновешен, не тратя все пространство на создание массива индексов, и в _very_ больших размерах понимание, вероятно, снова начнет расти быстрее, потому что вы также избегаете всех этих промахов в кеше (и, при действительно больших размерах, страницы промахов). Но в любом случае, я думаю, вы правы, что элегантность, вероятно, важнее производительности здесь. – abarnert