Хотя здесь уже есть несколько довольно разумных идей, я считаю, что стоит упомянуть следующее.
Заполнение пропущенных данных любым значением по умолчанию испортит статистические характеристики (стандартное и т. Д.). Очевидно, именно поэтому Mapad предложил хороший трюк с группировкой записей одинакового размера.
Проблема с этим (при условии, что нет никаких априорных данных о длине записей под рукой) состоит в том, что он требует даже больше вычислений, чем простое решение:
- не менее O (N * logN) * 1007 * 'len' вызовов и сравнений для сортировки с эффективным алгоритмом
- O (N) проверяет второй путь по списку для получения групп (их начальный и конечный индексы на «вертикальной» оси)
Использование Psyco - хорошая идея (поразительно проста в использовании, поэтому обязательно попробуйте).
Похоже, что оптимальным способом является использование стратегии, описанной Mapad в пуле № 1, но с модификацией - не для генерации всего списка, а для перебора словаря, преобразования каждой строки в numpy.array и выполнения необходимых вычислений. , Как это:
for row in data.itervalues():
np_row = numpy.array(row)
this_row_std = numpy.std(np_row)
# compute any other statistic descriptors needed and then save to some list
В любом случае несколько миллионов циклов в python не займут столько времени, сколько можно было ожидать. Кроме того, это не похоже на обычное вычисление, поэтому кого это волнует, если потребуется дополнительная секунда / минута, если оно запускается время от времени или хотя бы один раз.
Обобщенный вариант того, что было предложено Mapad:
from numpy import array, mean, std
def get_statistical_descriptors(a):
if ax = len(shape(a))-1
functions = [mean, std]
return f(a, axis = ax) for f in functions
def process_long_list_stats(data):
import numpy
groups = {}
for key, row in data.iteritems():
size = len(row)
try:
groups[size].append(key)
except KeyError:
groups[size] = ([key])
results = []
for gr_keys in groups.itervalues():
gr_rows = numpy.array([data[k] for k in gr_keys])
stats = get_statistical_descriptors(gr_rows)
results.extend( zip(gr_keys, zip(*stats)) )
return dict(results)