Улучшить время выполнения функции - PullRequest
3 голосов
/ 14 января 2020

Я создал функцию, которая получает структуры данных и заменяет все ее кортежи на списки.

например:

in_data = ({'name': 'Bob', 'age': 50, 'children': ('Alex', 'Justin', 'Daniel')},
           {'Name': 'Olive', 'Age': 42, 'Children': ('Rose', 'Vera', 'Karen')})

out_data = [{'name': 'Bob', 'age': 50, 'children': ['Alex', 'Justin', 'Daniel']}, 
            {'Name': 'Olive', 'Age': 42, 'Children': ['Rose', 'Vera', 'Karen']}]

это функция:

def t2l(data):
    if type(data) in [tuple]:
        data = list(data)
    for inx, item in enumerate(data):  
        if type(data) in [dict]:
            inx, item = item, data[item]
        if type(item) in [tuple]:
            data[inx] = list(item)
            item = data[inx]
        if type(item) in (list, dict, tuple):
            data[inx] = t2l(item)
    return data

Эта функция будет выполняться на миллионах строк в СДР, поэтому я хочу улучшить ее настолько, насколько смогу.

Есть ли способ улучшить время выполнения, как из готовых функций, которые я могу использовать, чтобы сделать это лучше?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 января 2020

Это должно быть быстрее, но я не уверен, хотите ли вы проверить что-либо еще, кроме tuple:

def t2l(data):
    for item in data:
        for key in item:
            if type(item[key]) is tuple:
                item[key] = [*item[key]]
    data = [*data]
    return data

Производительность:

%%timeit
t2l(in_data*1000000)

735 ms ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
json.loads(json.dumps(in_data*1000000))

4.43 s ± 37.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1 голос
/ 14 января 2020

Не знаю, будет ли он быстрее или повлияет на другие ваши данные, но вы можете сбросить до json и перезагрузить его

import json


print(json.loads(json.dumps(in_data)))
...