Как повторить / заморозить строку (отличную от верхней строки) на каждой странице в Google Sheets?

Я нашел этот Q / A очень интересным, так как он предлагает несколько разных решений для одной и той же проблемы. Я взял все эти функции и протестировал их со сложным словарным объектом. Я должен был взять две функции из теста, потому что им приходилось много неудачных результатов, и они не поддерживали возвращаемые списки или dicts как значения, которые я считаю существенными, так как функция должна быть подготовлена ​​почти для any

Итак, я перекачал другие функции в 100 000 итераций через модуль timeit, и выход пришел к следующему результату:

0.11 usec/pass on gen_dict_extract(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.03 usec/pass on find_all_items(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.15 usec/pass on findkeys(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1.79 usec/pass on get_recursively(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.14 usec/pass on find(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.36 usec/pass on dict_extract(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Все функции имели одинаковую иглу для поиска («logging») и того же словарного объекта, который строится следующим образом:

o = { 'temparature': '50', 
      'logging': {
        'handlers': {
          'console': {
            'formatter': 'simple', 
            'class': 'logging.StreamHandler', 
            'stream': 'ext://sys.stdout', 
            'level': 'DEBUG'
          }
        },
        'loggers': {
          'simpleExample': {
            'handlers': ['console'], 
            'propagate': 'no', 
            'level': 'INFO'
          },
         'root': {
           'handlers': ['console'], 
           'level': 'DEBUG'
         }
       }, 
       'version': '1', 
       'formatters': {
         'simple': {
           'datefmt': "'%Y-%m-%d %H:%M:%S'", 
           'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
         }
       }
     }, 
     'treatment': {'second': 5, 'last': 4, 'first': 4},   
     'treatment_plan': [[4, 5, 4], [4, 5, 4], [5, 5, 5]]
}

Все функции выдают тот же результат, но разницы во времени являются драматическими! Функция gen_dict_extract(k,o) - это моя функция, адаптированная из функций здесь, на самом деле она во многом похожа на функцию find от Alfe, с основным отличием, что я проверяю, имеет ли данный объект функцию iteritems, в случае передачи строк во время рекурсии:

def gen_dict_extract(key, var):
    if hasattr(var,'iteritems'):
        for k, v in var.iteritems():
            if k == key:
                yield v
            if isinstance(v, dict):
                for result in gen_dict_extract(key, v):
                    yield result
            elif isinstance(v, list):
                for d in v:
                    for result in gen_dict_extract(key, d):
                        yield result

Таким образом, этот вариант является самым быстрым и безопасным из функций здесь. И find_all_items невероятно медленный и далеко от второго самого медленного get_recursivley, в то время как остальные, кроме dict_extract, близки друг к другу. Функции fun и keyHole работают только в том случае, если вы ищете строки.

Интересный аспект обучения здесь:)

0
задан player0 22 March 2019 в 07:16
поделиться